1.SpringSecurity中的源码核心过滤器介绍
2.spring security 4 åspring security 3çåºå«
3.Java21 + SpringBoot3整合springdoc-openapi,自动生成在线接口文档,源码支持SpringSecurity和JWT认证方式
4.SpringSecurity Oauth2Authentication对象使ç¨
SpringSecurity中的源码核心过滤器介绍
本文将介绍SpringSecurity中常用的过滤器及其加载过程。
一、源码常用的源码过滤器
常用的过滤器共有个,具体如下:
1. org.springframework.security.web.context.SecurityContextPersistenceFilter:这是源码bes 源码第一个过滤器,其重要性不言而喻。源码它主要使用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:如果没有在配置文件中指定认证页面,html模拟访问源码则由该过滤器生成一个默认的认证界面。
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为了兼容未登录的访问,也走了一套认证流程,仿惠农网源码只不过是一个匿名的身份。
. 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:具体的nodejs用户注册源码实现类。
总结:通过上面的代码分析,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两个å段ã