权限学习 -- Spring Security数据库、缓存、自定义决策

数据库管理

Spring Security的核心处理流程:当一个用户登录时,会先执行身份认证,如果身份认证未通过会邀请用户重新认证。当用户身份认证通过后会调用角色管理器判断他是否可以访问。如果要实现数据库管理用户及权限就需要自定义用户登录功能。Spring Security为我们提供了UserDetailService接口,该接口只有一个方法UserDetail loadUserByUsername(),其中UserDetail也是一个接口,getAuthorities属性中存储了用户所有的权限。UserDetail也提供了用户是否过期,用户是否被锁定,证书是否过期,用户是否有效这些方法。任何一个方法返回false用户的凭证就会被认为是无效的。Authentication对象是提供用户安全访问信息的安全对象。Authentication有已认证和未认证的两种状态,在作为参数传入认证管理器的时候,它是一个未认证对象。它从客户端获取的用户信息如用户、密码可以从登陆页面也可以从cookie中获取,并由系统自动构成一个Authentication对象。而UserDetails它代表的是用户信息安全的源,这个源可以是从数据库、LDAP服务器、CA中心返回。Spring Security要做的就是将这个未认证的Authentication对象和UserDetails做进行匹配,成功后将UserDetails的用户权限信息拷贝到Authentication中,组成一个完整的Authentication对象与其他组件进行共享。UserDetails即可从数据库返回也可以从其它如LDAP中返回。当我们需要使用数据库进行管理时,我们需要实现UserDetailService里的loadUserByUsername方法。这就需要我们准备以下几张表:用户表。权限表、角色表、用户和角色关系表、角色和权限关系表。UserDetails中的用户状态通过用户表里的属性去填充,UserDetails中的权限集合则是通过用户表、权限表、用户和角色关系表、角色和权限关系表构成的RBAC模型来提供。

 

权限缓存

Spring Security的权限缓存和数据库管理有关,都是在用户认证上做文章,因此都UserDetailService有关,与数据库管理不同的是Spring Security提供了一个可以缓存UserDetailService的实现类,这个类的名字叫做CachingUserDetailService,该类的构造接收一个真正加载UserDetailsUserDetailService实现类,当需要加载UserDetails时,会首先从缓存中获取,如果缓存中没有对应的UserDetails存在,则使用持久的UserDetailService实现类进行加载,然后将加载后的结果保存在缓存中。UserDetails与缓存的交互是通过UserCache接口来实现的。CachingUserDetailService默认拥有UserCache的一个空引用实现--null usercache,当缓存中不存在对应的UserDetails时,将使用引用的UserDetailService类型的dalegate进行加载,加载后再将其放在缓存中进行返回,除了nullusercache之外,Spring Security还提供了一个基于EhCacheUserCache的实现类,这个类的名字叫做EhCacheBaseUserCache。当我们需要对UserDetails进行缓存时,我们只需要进行定义一个EhCache的实例,然后注入到EhCacheBaseUserCache中就可以了。上述两个类都是Spring Security已经实现了的。在实际项目中为了更好的使用及控制缓存,我们会尝试引入更多的Cache,我们不仅缓存UserCache还有缓存用户相关的权限。实际项目在做权限控制时,我们一般会选择自己对相关的数据进行缓存

 

自定义决策

当用户身份认证通过后,它会调用角色管理器判断是否可以继续访问,要实现自定义决策管理器需要继承AbstractAccessDecisionManager这个类,它的核心方法是supports方法,其下有个AccessDecisionVoter,是Spring Security引入的投票器的概念,有无权限的最终决定权就是由这个投票器决定的。最常见的投票器有RoleVoter,投票器核心由vote选举实现的。AffirmmativeBased方案是只要有一个投票通过就允许访问。ConsensusBased,这个投票器的方案是有有一半以上投票通过才允许访问资源。UnanimousBaesd这个投票器的方案是所有的投票器都通过才允许访问资源

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值