【busybox源码详解】【文字滚动显示源码】【试盘线源码】spring security3 源码

时间:2024-11-28 16:59:52 来源:养牛农场源码 分类:百科

1.SpringSecurity中的源码核心过滤器介绍
2.spring security 4 和spring security 3的区别
3.Java21 + SpringBoot3整合springdoc-openapi,自动生成在线接口文档,源码支持SpringSecurity和JWT认证方式
4.SpringSecurity Oauth2Authentication对象使用

spring security3 源码

SpringSecurity中的源码核心过滤器介绍

       本文将介绍SpringSecurity中常用的过滤器及其加载过程。

       一、源码常用的源码过滤器

       常用的过滤器共有个,具体如下:

       1. org.springframework.security.web.context.SecurityContextPersistenceFilter:这是源码busybox源码详解第一个过滤器,其重要性不言而喻。源码它主要使用SecurityContextRepository在session中保存或更新一个SecurityContext,源码并将SecurityContext提供给后续过滤器使用,源码为后续filter建立所需的源码上下文。SecurityContext中存储了当前用户的源码认证和权限信息。

       2. org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter:此过滤器用于继承SecurityContext到Spring异步执行机制中的源码WebAsyncManager,是源码文字滚动显示源码spring整合必须的。

       3. org.springframework.security.web.header.HeaderWriterFilter:向请求的源码header中添加响应的信息,可以在http标签内部使用security:headers来控制。源码

       4. org.springframework.security.web.csrf.CsrfFilter:Csrf又称跨域请求伪造,SpringSecurity会对所有post请求验证是否包含系统生成的csrf的token信息,如果不包含则报错,起到防止csrf攻击的效果。

       5. org.springframework.security.web.authentication.logout.LogoutFilter:匹配URL为/logout的请求,实现用户退出,清除认证信息。

       6. org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter:认证操作全靠这个过滤器,默认匹配URL为/login且必须为POST请求。

       7. org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter:如果没有在配置文件中指定认证页面,试盘线源码则由该过滤器生成一个默认的认证界面。

       8. org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter:由此过滤器生成一个默认的退出登录页面。

       9. org.springframework.security.web.authentication.www.BasicAuthenticationFilter:此过滤器会自动解析HTTP请求中头部名字为Authentication,且以Basic开头的头部信息。

       . org.springframework.security.web.savedrequest.RequestCacheAwareFilter:通过HttpSessionRequestCache内部维护一个RequestCache,用于缓存HttpServletRequest。

       . org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter:针对ServletRequest进行一次包装,使得request具有更加丰富的API。

       . org.springframework.security.web.authentication.AnonymousAuthenticationFilter:当SecurityContextHolder中认证信息为空,则会创建一个匿名用户存储到SecurityContextHolder中,SpringSecurity为了兼容未登录的访问,也走了一套认证流程,上海seo推广源码只不过是一个匿名的身份。

       . org.springframework.security.web.session.SessionManagementFilter:SecurityContextRepository限制同一个用户开启多个会话的数量。

       . org.springframework.security.web.access.ExceptionTranslationFilter:异常转换过滤器位于整个SpringSecurityFilterChain的后方,用来转换整个链路中出现的异常。

       . org.springframework.security.web.access.intercept.FilterSecurityInterceptor:获取所有配置资源的访问授权信息,根据SecurityContextHolder中存储的用户信息来决定其是否有权限。

       二、过滤器加载过程

       1. DelegatingFilterProxy:我们在web.xml中配置了一个名称为SpringSecurityFilterChain的过滤器DelegatingFilterProxy,接下来可以查看该源码。

       2. FilterChainProxy:通过上面的源码分析我们发现其实创建的是FilterChainProxy这个过滤器,那我们来看下这个过滤器。

       3. SecurityFilterChain和DefaultSecurityFilterChain:具体的github恐惧饥饿源码实现类。

       总结:通过上面的代码分析,SpringSecurity中要使用到的过滤器最终都保存在了DefaultSecurityFilterChain对象的List filter对象中。

spring security 4 和spring security 3的区别

       ã€€Spring Security3的使用中,有4种方法:   一种是全部利用配置文件,将用户、权限、资源(url)硬编码在xml文件中,已经实现过,并经过验证;   二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置,目前这种方式已经实现,并经过验证。   三种是细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器, 并分别实现AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,并在配置文件中进行相应配置。 目前这种方式已经实现,并经过验证。   四是修改spring security的源代码,主要是修改InvocationSecurityMetadataSourceService和UserDetailsService两个类。 前者是将配置文件或数据库中存储的资源(url)提取出来加工成为url和权限列表的Map供Security使用,后者提取用户名和权限组成一个完整的(UserDetails)User对象,该对象可以提供用户的详细信息供AuthentationManager进行认证与授权使用。

Java + SpringBoot3整合springdoc-openapi,自动生成在线接口文档,支持SpringSecurity和JWT认证方式

       在Java 2.1与SpringBoot 3的项目开发中,我探索了一种方法,即通过整合springdoc-openapi来实现在线接口文档的自动生成,支持Spring Security和JWT认证。我的目标是打造一个适应多端且功能丰富的开发模板,方便开发者快速构建和扩展。

       本项目采用前后端分离模式,后端基于Java 2.1和SpringBoot 3,利用Spring Security、JWT、Spring Data JPA等技术进行开发,前端则提供了vue、angular、react、uniapp和微信小程序等多种技术栈。重点在于,如何利用OpenAPI规范来定义和展示API,这使得开发者无需深入了解源代码,就能理解API的功能和用法,极大地提高了开发效率。

       OpenAPI规范,即OAS,定义了RESTful API的通用标准,让开发者和工具能够理解和操作API。遵循OpenAPI,可以使用文档生成工具展示API,代码生成工具自动生成代码,甚至进行自动化测试。中国的OpenAPI规范中文版文档可参考这里。

       Swagger作为OpenAPI的实现工具,提供了组件如描述文件的维护,有助于更新文档和生成客户端和服务器端代码。Swagger的官方文档可在这里找到。

       Springfox是基于Swagger 2.x的API文档生成工具,它简化了Java开发者的工作,提供了注解支持和自动生成文档的功能。Springfox官方文档位于这里。

       然而,随着技术的发展,SpringDoc基于OpenAPI 3.0规范应运而生,成为了Spring Boot 2.4及以上版本的首选。相比Springfox,SpringDoc提供了更强大的扩展性和更好的社区支持。在SpringBoot 3中,推荐使用springdoc-openapi-ui进行集成。SpringDoc的官方文档可在这里查阅。

       在实践中,要实现这个功能,首先在pom.xml中引入springdoc-openapi-starter-webmvc-ui等相关依赖,然后配置application.yml,设定api-docs和swagger-ui的访问路径。如果项目有权限控制,需适当设置访问权限,如允许匿名访问api-docs和swagger-ui。在Controller类和实体类中,使用@Operation注解配合之前定义的security配置来指定认证方式。

       通过上述步骤,你可以生成符合规范的接口文档,方便团队协作和API的使用。后续我会不断更新学习心得,期待与大家一起进步。

SpringSecurity Oauth2Authentication对象使用

        在调用资源服务器的过程中,我们会将申请的token 作为header值进行传递,携带调用者的身份信息。但是资源服务器是如何通过token对调用者的身份进行判断的呢?

       

        Security中有一个Filter实现了对token信息的转换,将token值转换成了调用者的用户信息。该filter就是 Oauth2AuthenticationProcessingFilter

       

        一、查看源码

        查看Oauth2AuthenticationProcessingFilter的doFilter方法

        通过查看Oauth2AuthenticationProcessingFilter的dofilter方法,重点有两点

        (1)将request中的token提取出来封装成Authentication对象

        (2)将Authentication交给authenticationManager进行鉴权处理

        下面我们重点看下这两处的处理。

       

        二、token到Authentication对象转换实现

       

        Authentication authentication = tokenExtractor.extract(request);

        tokenExtractor在Oauth2AuthencationProcessingFilter中的默认实现是BearerTokenExtractor,我们查看BearerTokenExtractor的extract()方法。

       

       

        三、Authentication对象的鉴权

        Authentication authResult = authenticationManager.authenticate(authentication);

        此处的authenticationManager的实现类是Oauth2AuthenticationManager,而不是我们之前一直提到的ProvicerManager。我们看下Oauth2AuthenticationManager中的authenticate()方法。

       

       

        RemoteTokenService 的 loadAuthentication() 方法

       

       

        用户认证转换类

        * 接口层注入的 OAuth2Authentication对象中的 principal属性即在该类的extractAuthentication() 方法中实现的。

        * security默认使用的是 DefaultAccessTokenConverter类中的extractAuthentication()方法中使用。

        * 通过继承UserAuthenticationConverter该类,实现其中的extractAuthentication()方法来满足我们自己构造 principal属性的需求。

        * 在ResourceConfig类中,继续使用DefaultAccessTokenConverter,但是类中的UserAuthenticationConverter我们里换成我们自己的CustomUserAuthenticationConverter实现类。

        *

        * 我们构造的principal属性是map类,里面包含phone和userId两个字段。