zoukankan      html  css  js  c++  java
  • 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:所有投票器全部通过,才会允许访问。

    架构图:

  • 相关阅读:
    HDU3336 Count the string —— KMP next数组
    CodeForces
    51Nod 1627 瞬间移动 —— 组合数学
    51Nod 1158 全是1的最大子矩阵 —— 预处理 + 暴力枚举 or 单调栈
    51Nod 1225 余数之和 —— 分区枚举
    51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP
    51Nod 机器人走方格 V3 —— 卡特兰数、Lucas定理
    51Nod XOR key —— 区间最大异或值 可持久化字典树
    HDU4825 Xor Sum —— Trie树
    51Nod 1515 明辨是非 —— 并查集 + 启发式合并
  • 原文地址:https://www.cnblogs.com/cccy0/p/10688442.html
Copyright © 2011-2022 走看看