前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringSecurity的认证实现分析

SpringSecurity的认证实现分析

作者头像
编程随笔
发布2024-03-23 07:49:32
1220
发布2024-03-23 07:49:32
举报
文章被收录于专栏:后端开发随笔后端开发随笔

实现机制

概括来讲,是将认证信息放在Session中,当客户端发起访问时检查Session中是否存在认证信息,以及认证信息中的权限是否满足预期。 更具体地说,是通过Filter来拦截客户端请求并进行判断处理,使用的Filter链如下:

代码语言:javascript
复制
[
org.springframework.security.web.context.SecurityContextPersistenceFilter, 
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter, 
org.springframework.security.web.header.HeaderWriterFilter, 
org.springframework.security.web.authentication.logout.LogoutFilter, 
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter, 
org.springframework.security.web.authentication.www.BasicAuthenticationFilter, 
org.springframework.security.web.savedrequest.RequestCacheAwareFilter, 
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter, 
org.springframework.security.web.authentication.AnonymousAuthenticationFilter, 
org.springframework.security.web.session.SessionManagementFilter, 
org.springframework.security.web.access.ExceptionTranslationFilter, 
org.springframework.security.web.access.intercept.FilterSecurityInterceptor
]

值得注意的是:这些Filter都是Spring Security框架中定义的,它们会被加载到Spring容器中,最终会被包装到FilterChainProxy$.VirtualFilterChainadditionalFilters属性中。

那么这些Filter是如何生效的呢?

与普通的Sevlet Filter不同,这些Filter不需要在web.xml中明确配置,但是需要在web.xml中配置org.springframework.web.filter.DelegatingFilterProxy作为进入Spring Security框架的入口。

代码语言:javascript
复制
<!-- 集成Spring Security框架 -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

DelegatingFilterProxy的执行路径如下: org.springframework.web.filter.DelegatingFilterProxy.doFilter() ->org.springframework.security.web.FilterChainProxy.doFilter() -> doFilterInternal() ->org.springframework.security.web.FilterChainProxy$.VirtualFilterChain.doFilter()

最后是在org.springframework.security.web.FilterChainProxy$.VirtualFilterChain.doFilter()方法中依次取出additionalFilters属性中的Filter对象执行拦截操作。

认证流程

如上所述,Spring Security的认证实现都是通过Filter拦截来实现的,最终是在org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication()方法中实现的。 具体的执行流程图如下:

SpringSecurity登录认证流程
SpringSecurity登录认证流程

默认情况下,Spring Security处理登录认证的URI地址为/login,且只支持POST方法,这可以从UsernamePasswordAuthenticationFilter的构造函数中得到确认。

代码语言:javascript
复制
public UsernamePasswordAuthenticationFilter() {
    super(new AntPathRequestMatcher("/login", "POST"));
}

也就是说在<security:form-login>中指定的login-processing-url属性实际上必须是/login,同时也必须把自定义登录页面表单中的action属性也设置为login

当然,Spring Security处理登录认证的URI地址是可以修改的,如下所示在<security:form-login>中修改:

代码语言:javascript
复制
<!--授权自定义登录页-->
<security:form-login login-processing-url="/lg">

特别注意:如果修改了默认认证地址URI,则必须同步修改自定义登录页面表单中的action属性值。

【参考】 java笔记----springMvc简单整合spring-security示例

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现机制
  • 认证流程
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档