三、SpringSecurity基础-认证原理

1、认证流程原理

1.1、认证流程

SpringSecurity 是基于 Filter 实现认证和授权,底层通过 FilterChainProxy 代理去调用各种 Filter(Filter链),Filter 通过调用 AuthenticationManager 完成认证,通过调用AccessDecisionManager完成授权,SpringSecurity中核心的过滤器链 详情如下:

  •  SecurityContextPersistenceFilter: Filter 的入口和出口,它是用来将 SecurityContext (认证的上下文,里面有登录成功之后的认证授权信息) 对象持久到 Session 的 Filter ,同时会把SecurityContext 设置给 SecurityContextHolder 方便我们获取用户认证授权信息。
  • Username,PasswordAuthenticationFilter : 默认拦截 "/login" 登录请求,处理表单的登录认证,将请求中的人则会认证信息包括 Username,Password 等封装成UsernamePasswordAuthenticationToken,然后调用AuthenticationManager 的认证方法进行认证。
  • BasicAuthenticationFilter: 基本认证,不支持 HttpBasic 认证方式的 Filter。
  • RememberAuthenticationFilter:记住我功能实现的 Filter。
  • AnonymousAuthenticationFilter:匿名Filter,用来处理匿名访问的资源,如用户未登录,SecurityCintext 中没有Authentication,就会创建匿名的Token(AuthenticationToken),然后通过SecurityCintextHodler 设置到 SecurityContext 中。
  • ExceotionTranslationFilter: 用来捕获 FilterChain 所有的异常,进行处理,但是只会处理AuthenticationException 和 AccessDenuedException 异常,其他的异常,会继续抛出。
  • FilterSecurityInterCeptor: 用来做授权的Filter,通过父类(AuthentionSecurityInterceptor.beforeInvocation) 调用AccessDecision.decide 方法对用户进行授权。

1.3、Security 相关概念

  • Authentication:
    • 认证对象,用来封装用户的认证信息(账户状态,用户名,密码,权限等)所有提交给AuthenticationManager 的认证请求都会被封装成一个Token的实现,比如:最容易理解的 UsernamePasswordAuthenticationToken ,其中就包含了用户名和密码
    • Authentication 常用的实现类:
    • UsernamePasswordAuthenticationToken :用户名密码登录的Token
    • AnonymousAuthenticationToken:针对匿名用户的Token。
    • RememberMeAuthenticationToken:记住我功能的Token。
  • Authentication:
    • 用户认证的管理类,所有的认证请求(比如login) 都会提交到登录信息的Token对象给AuthenticationManager 的 authenticate() 方法来实现认证。AuthenticationManager 会调用 AuthenticationProvider.authenticate 进行认证。认证成功后,返回一个包含了认证信息的 Authentication 对象。
  • AuthenticationProvider:
    • 认证的具体实现类,一个 provider 是一种认证方式的实现,比如提交的用户名密码,我是通过和DB中查询出的user记录作比对实现的,那就有一个DaoProvider;如果我是通过CAS请求单点登录系统实现,那就有一个CASProvider。按照Spring一贯的作风,主流的认证方式它都已经提供了默认实现,比如DAO、LDAP、CAS、OAuth2 等。前面讲了 AuthenticationManager 只是一个代理接口,真正的认证就是由 AUthenticationProvider 类做的。一个 AuthenticationManager 可以包含多个Provider,每个provider通过实现一个support 方法来表示自己支持那种 Token 的认证。
    • AuthenticationManager 默认的实现类是 ProviderManager。
  • UserDetailsService:
    • 用户的认证通过 Provider 来完成,而 Provider 会通过 UserDetailsService 拿到数据库(或内存) 中的认证信息然后和客户端提交的认证信息做校验。虽然叫 Service,但是我更愿意把它认为是我们系统里经常有的UserDao。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值