Spring : Spring Security

==========================================================================
spring-security-过滤器:

顶级Filter:SecurityContextPersistenceFilter:加载SecurityContext或者创建SecurityContext放在SecurityContextHolder里面。并在所有过滤器执行完之后清空SecurityContextHolder。

LogoutFilter:处理注销操作。销毁session等。

AbstractAuthenticationProcessingFilter:处理form登录过滤器,通过用户名密码判断登录是否有效。

DefaultLoginPageGeneratingFilter:spring-security提供的默认登录页面。

BasicAuthenticationFilter:与AbstractAuthenticationProcessingFilter类似,验证方式不同。

SecurityContextHolderAwareRequestFilter:包装客户请求,提供一些额外的数据。

RememberMeAuthenticationFilter:提供记住登录功能。cookie中存在时,自动创建context。

AnonymousAuthenticationFilter:匿名用户的登录权限过滤。

ExceptionTranslationFilter:处理抛出的异常,将请求重定向,或返回错误代码等。

SessionManagementFilter:防御session攻击,在登录成功后销毁session并重新生成session。

FilterSecurityInterceptor:用户授权控制,如果尚未认证,那么抛出尚未认证异常,如果已登录但没有权限,则抛出拒绝访问异常。如果已登录,而且有权限,则通过过滤。

FilterChainProxy:按照顺序调用一组Filter。

========================================================================
spring-security-数据库管理:

需要实现 UserDetailsService接口,并实现loadUserByUsername方法。这个方法返回一个UserDetail对象。
UserDetails接口:用户相关信息:
getAuthorities() 权限集合
getPassword() 密码
getUsername() 用户名
isAccountNonExpired() 有没有过期
isAccountNonLocked() 有没有锁定
isCredentialsNonExpired()证书有没有过期
isEnabled() 账户是否有效

整个流程:从请求中(cookie中或参数中等)获取请求验证信息,如用户名和密码,然后放入一个未认证的Authentication中,与UserDetail进行匹配,生成一个新的已认证的Authentication供其他组件使用。

=======================================================================
spring-security-权限缓存

CachingUserDetailsService: 需要一个UserDetailsService,如果没有UserCache,则使用UserDetailsService获取User并放入UserCache里面。

=========================================================================
spring-security-决策管理

AccessDecisionManager:决策管理器。对应的抽象类为:AbstractAccessDecisionManager(自定义需要继承它)
supports方法即为授权关键方法,返回true即为有权限,里面会循环一组AccessDecisionVoter所有Voter通过才返回true

RoleVoter:最常用的投票器,定义了权限的前缀 ROLE_ ,vote方法即为选举方法,authentication为当前用户的权限,attributes为访问所需权限,如果有权限,那么返回 ACCESS_GRANTED

有三个已经实现的决策管理器(继承AbstractAccessDecisionManager):
AffirmativeBased:有一个投票器通过,就会通过。
ConsensusBased:有一半以上投票器通过,才会允许访问。
UnanimousBased:所有投票器全部通过,才会允许访问。

架构图:

 

posted @ 2019-04-11 11:11  cccy0  阅读(232)  评论(0编辑  收藏  举报