SpringSecurity介绍与使用

**

1、SpringSecurity介绍

原因:为avaEE开发、server规范或者EJB规范找不到应用场景的解决方案、提供一些可定制的安全应用
认证和验证

**在这里插入图片描述验证模式: 主要是Basic、Digest、X.509证书认证、LDAP、Form等
权限拦截
SpringSecurity常用的拦截器:

  • SecurityContextPer’missionFilter: 在执行之前,最开始判断当前Session中是否包含一SecurityConText,如果存在,就放在SpringSecurityHolder中的Context中,如果不存在就创建一个放进去,清空SpringSecurityHolder的Context,因为要清除TreadLocal。否则会受到线程池的影响
    TreadLocal解决多线程安全问题提供很好的思路,为每一个Tread都提供了一个副本,解决并发中的冲突问题。记住。在线程结束的时候要将treadLocal中的信息移除掉Remove。
  • LogOutFilter: 处理注销请求,默认接的请求为J_Spring_Security_logOut. 用途:用户在发注销请求时,清除用户的Session以及SecurityContext中的信息。重定向到用户注销页面,同时清空用户的Cookies
  • AbstractAuthenticationProcessingFilter: 处理From登录的过滤器,默认接收请求为J_Spring_Security_Check,是用户使用From登录的提交地址。通过用户名以及密码,判断用户是否有效。成哥跳进页面,否则失败页面
  • DefaultLoginPageGeneratingFilter: 用来生成默认的登录页面,默认的访问地址为Spring_Security_LogIn,
  • BasicAuthenticationFilter: 主要是处理Basic验证,
  • SpringContextHolderAwareRequestFilter: 用来包装客户的请求,目的是在原来的请求上基础上对后续程序 提供一些额外的数据,比如getRemoveUser时,获取当前登录名等
  • RememberMeAut’henticationFilter: 使用的RemberMe功能,当用户Cookies中包含remembermMe标记的时候。会根据用户登录的标记,创建相应的
    SecurityContext创建相应的权限。依赖Cookies实现,登录成功的时候会将生成一个唯一标识Token存在Cookies中,我们通过浏览器查看电脑用户的cookies
  • Anonymous AuthenticationFilter: 为了保证操作统一性,当用户没有登录的时候,默认为用户分配匿名用户的权限。
  • ExceptionTranslationFilter: 处理filter,Security以及 interset中抛出的异常,获取异常的地方
  • SessionManagmentFilter: 未处理 主要是用户登录之后,销毁用户的当前Sessoion,并重新生成Session
  • FilterSecirityIntercepto: 用户的页面权限 ,如果用户尚未登录,会抛出未登录异常,如果用户已登录,但是没有获得当前资源的权限,会抛出不直接访问的异常。如果用于已登录,且有权限,会放行
  • FllterChainProxy: 会按照顺序调用一组Filter,使得Filter拥有验证,授权的本质工作,也能使用SpringIOC的功能。得到其他依赖的资源

SpringSecurity的数据管理:
在这里插入图片描述
userDetailsService:
根据用户名获取用户信息


public interface UserDetails extends Serializable {
    Collection<? extends GrantedAuthority> getAuthorities();
    String getPassword();
    String getUsername();
    boolean isAccountNonExpired();
    boolean isAccountNonLocked();
    boolean isCredentialsNonExpired();
    boolean isEnabled();
}

authentication:

public interface Authentication extends Principal, Serializable {
	Collection<? extends GrantedAuthority> getAuthorities();//权限集合
	Object getCredentials();//获取凭证
	Object getDetails();//获取认证一些额外信息
  	Object getPrincipal();//过去认证的实体
   	boolean isAuthenticated();//是否认证通过
   	void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;//
   	}

当用户通过过了验证,会通过userDtailsService跟Authentication进行匹配,将userDetailsService中的权限付给authentication,组成完整的authentication,给其他元件使用
SpringSecurity的缓存
提供了缓存userService类,CachingUserDetailsService,主要作用:通过缓存获取UserDetails,如果获取不到就会使用持久类UserDetailsService加载,并将结果存在缓存中。并换回,在EhCacheBasedUserCache中,我们在对UserDetails进行缓存时候,我们只需要定义一个EhCache的实例,然后注入到EhCacheBased中就行了,我们有时候用权限缓存时,也会去缓存用户信息,比如redis

public class CachingUserDetailsService implements UserDetailsService {
    private UserCache userCache = new NullUserCache();
    private final UserDetailsService delegate;

    CachingUserDetailsService(UserDetailsService delegate) {
        this.delegate = delegate;
    }

    public UserCache getUserCache() {
        return userCache;
    }

    public void setUserCache(UserCache userCache) {
        this.userCache = userCache;
    }

    public UserDetails loadUserByUsername(String username) {
        UserDetails user = userCache.getUserFromCache(username);

        if (user == null) {
            user = delegate.loadUserByUsername(username);
        }

        Assert.notNull(user, "UserDetailsService " + delegate + " returned null for username " + username + ". " +
                "This is an interface contract violation");

        userCache.putUserInCache(user);

        return user;
    }
}

SpringSecurity 决策器
一般都继承抽象类AbstractAccessDecisionManager而不是实现接口,观看AbstractAccessDecisionManager。核心是setDecisionVoters方法,RoleVoter,主要是投票器机制,
分为AffirmativeBased:一票制,ConsensusBased:3票制,UrlAccessDecisionManager:全票制
我们可以自定义投票制

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值