Spring-Security@PreAuthorize("hasAuthority('')")源码分析

Spring-Security@PreAuthorize(“hasAuthority(’’)”)源码分析
demo
@PreAuthorize(“hasAuthority(‘xxx’)”)用来鉴别当前登录用户所拥有的角色是否有xxx权限访问该接口。
点进去看看security是如何来鉴权的。

hasAuthority
这里authority即为我们传入的权限,比如prod:create,接下来再看this.hasAnyAuthority如何处理这个权限字符串吧。
hasAnyAuthority
翻看源码的话会发现其实hasAnyAuthority方法就在hasAuthority方法的下面,该访问hasAnyAuthorityName了,我们传入的权限字符串(prod:create)就像皮球一样被踢到了hasAnyAuthorityName脚下了~
hasAnyAuthorityName
该方法终于要射门了!
首行为 Set roleSet = this.getAuthoritySet(); 点进去getAuthorityeSet()方法看到
getAuthoritySet
该方法为获取当前用户所拥有角色的所有权限,Collection<? extends GrantedAuthority> userAuthorities = this.authentication.getAuthorities();此行为登录操作时应访问数据库将用户权限放入authentication中,也就是说,这一行将会把该用户所持角色的所有权限都查询出来。
此时我们的鉴权字符串(“prod:create”)被守门员getRoleWithDefaultPrefix()拿下,来看看守门员是怎么守住这球的:
getRoleWithDefaultPrefix
原来是判断一下这球是不是假动作啊,该方法会对传入的(prod:create)进行组装,前面传入的这个defaultRolePrefix为null,所以直接返回role即可,也就是我们一开始传入的“prod:create”。
该比对了,prod:create字符串在权限集合roleSet中,即该用户有访问该接口的权限。
总的来说,鉴权过程为:从数据库中查询出当前登录用户的所有权限并交给security管理;注解@PreAuthorize(“hasAuthority(‘xxx’)”)来判断“xxx”是否在当前登录用户的权限集合中,在则200,不在则403。
谢谢!

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值