1、Spring Security和Shiro
-
Spring Security重量级,配置简单
-
Shiro轻量级,配置复杂
2、认证和授权
-
UsernamePasswordAuthenticationFilter负责认证
-
FilterSecurityInterceptor负责授权
3、核心组件
-
SecurityContextHolder:存储身份信息和认证信息(使用ThreadLocal策略来存储认证信息),可在程序任何地方获取SecurityContext,使用SecurityContextHolder.getContext()来获取
-
Authentication:用来获取当前登录用户的认证信息
-
Principal:用户信息,没有认证时一般是用户名,认证后一般是用户对象
-
Credentials:用户凭证,一般是密码
-
Authorities:用户权限
-
-
SeucirtyContext:上下文对象,用来获取Authentication,调用getAuthentication()方法
-
AuthenticationManager: 身份认证器,认证的核心接口
-
UserDetailsService:一般用于从数据库中加载身份信息
-
UserDetails: 相比Authentication,有更详细的身份信息
4、认证流程
-
用户提交用户名和密码
-
根据用户名查询数据库,得到用户信息,和数据库中的数据进行比对
-
若对比通过,把数据封装到Authentication中
-
最后把Authentication返回到SeucirtyContext上下文中
5、授权流程
-
拦截请求:已认证用户访问受保护的web资源将被SecurityFilterChain中的 FilterSecurityInterceptor 的子类拦截
-
获取请求策略:FilterSecurityInterceptor会从 SecurityMetadataSource 的子类DefaultFilterInvocationSecurityMetadataSource 获取要访问当前资源所需要的权限集合
-
FilterSecurityInterceptor会调用 AccessDecisionManager 进行授权决策,若决策通过,则允许访问资源,否则将禁止访问