Spring Security的角色roles是什么
admin
2023-02-20 08:00:14
0

Spring Security的角色roles是什么?这篇文章从源码出发,详细解析了Spring Security的角色roles,感兴趣的小伙伴们可以参考借鉴,希望对大家有所帮助。 
我们在进行角色权限控制设计时,一般包括账户(users)、角色(roles)、权限(authorities)这三部分。
1)一个账户一般对应一个或多个角色;
2)一个角色对应多个权限(authorities),反过来一个权限也对应多个角色;
3)账户只和角色关联,通过角色,间接和权限产生关系;
4)角色不是固定死的,是能够动态创建的,每个角色具有的权限能够灵活的进行调整;
5)在系统完成详细设计后,有哪些权限就已经确定下来,权限的层级结构和数量、与账户和角色没半点关系。  
基于以上的说明,我们从源码的角度来说明Spring Security的账户、角色和权限是怎么一回事。
Spring Security工作流程:通过登录的账户,找到该账户对应的角色/权限,并把自定义的权限集合转换为Spring Security认可的权限集合List,然后结合自定义的账号、密码,和新权限集合这三个参数,创建一个Spring Security认可的账号实例,再然后根据自定义的鉴权规则,进行权限控制。  
这里面如何创建账号、角色、权限,实现用户认证、进行鉴权的细节就不讲了,因为这个不是本篇文章的重点,有兴趣的读者可以看我的视频介绍:https://edu.51cto.com/course/21185.html ,里面有详细的如何进行实战型的Spring Security角色权限控制模块的开发。  
重点来了,通过应用角色权限控制的应用,看Spring Security如何利用角色和权限的
四种鉴权的方式:
        hasRole(String role)
        hasAnyRole(String... roles)
        hasAuthority(String authority)
        hasAnyAuthority(String... authorities)
在源码类SecurityExpressionRoot.java中,我们看看这四种方式的实现形式:
Spring Security的角色roles是什么
大家从上面的图看出什么端倪没有?  
        hasRole(String role)  --》 hasAnyRole(String... roles)  --》hasAnyAuthorityName
        hasAuthority(String authority)  --》hasAnyAuthority(String... authorities)  --》hasAnyAuthorityName
不管是基于角色,还是基于权限,最后鉴权都落实到hasAnyAuthorityName这个方法上。

        follow me,我们继续往下刨根,看看hasAnyAuthorityName这个方法里面有些什么,注意上面代码中的调用hasAnyAuthorityName时,传递的参数,一个是
Spring Security的角色roles是什么  
另外一个是
Spring Security的角色roles是什么  
对应的都是一个实现方法。

从hasAnyAuthorityName这个方法中,我们可以知道,这是把传进去的一个或多个角色/权限,在登录用户具有的权限中进行查找  
Spring Security的角色roles是什么  
        这里面的大家看到了吧,角色和权限是混合在一起进行鉴权的(题外话,大家看大神们写的代码,注意到其中的var5、var6、var4,这是搞什么?严重不符合命名规范啊)。
那么Spring Security是如何区分集合中的是权限、还是角色呢,我们继续抽丝剥茧,看看该方法中的getRoleWithDefaultPrefix(prefix, role)方法  
Spring Security的角色roles是什么  
Spring Security的角色roles是什么  
看上面的代码清晰明了了吧,说明如下:
        如果传进去的角色名称/权限名称为null,直接返回null;
        如果传进去的角色名称/权限名称不为null,则判断defaultRolePrefix前缀这个参数是否为空和其长度,如果不为空,且长度不为0,则传进的参数为角色名称,那么继续判断其是否是以“ROLE”开始,如果不是,则在名称前添加前缀“ROLE”,并返回新的名称;
        如果不是以上情况,即参数是权限名称或者带有“ROLE_”前缀的角色名称,直接返回传进去的字符串参数。

        看了以上的部分源码解析,我们可以得出什么结论呢(以角色、权限存放在数据库为例):
        1、原生的角色和权限并没有本质的区别,在鉴权时走的是完全相同的一个通道;
        2、在进行权限控制时,角色可加可不加“ROLE”前缀,但在数据库中定义时,角色名称一定要添加“ROLE”前缀;
        3、角色与权限之间并没有建立映射关系,角色是角色、权限是权限,这与我们实际应用中对角色的要求有很大出入;
        4、实际应用中的角色被固化到代码中,也与实际要求不符,实际应用中,权限作为子节点可以写死,而角色作为全部或者部分权限的集合应该可以灵活调整;
        5、不管是角色鉴权,还是权限鉴权,都只是以角色/权限的名称作为判断依据,所以权限的名称要唯一。
        另外,从Spring Security的源码分析中可以发现,我们还可以通过RoleHierarchy进行角色的继承(默认admin登录只能访问/admin,访问不了/user;而user登录只能访问/user),但在实际项目中,最主要强调的是角色的灵活性,而不是继承性。
        所以,对角色的管理、角色和权限的映射关系,都需要我们自己来实现。
        看完上述内容,你们对Spring Security的角色有进一步的了解吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读。

相关内容

热门资讯

民进党官员称鼠患非认知战,蒋万... 海峡导报综合报道 台北市鼠患引发关注,“青鸟”借机攻击国民党籍台北市长蒋万安,外界质疑沦为政治攻防、...
视频丨五一档票房7.58亿元!... 据国家电影局统计,今年五一档电影票房为7.58亿元,观影人次为2084.19万,放映场次为237.6...
康斯坦茨取得低压智能电容装置专... 国家知识产权局信息显示,康斯坦茨集团有限公司取得一项名为“一种低压智能电容装置”的专利,授权公告号C...
网络适老不应只是放大字体 当前,我国银发网民规模已达1.61亿,老年群体对网络的需求,早已超越“放大字体”的浅层便利,更迫切需...
AMD业绩全面超预期,AI服务... AMD最新财报释放出强烈信号:AI需求仍在扩张,且不再只集中于GPU。公司营收、利润和二季度展望全面...
耳卫士听力上海西嘉杨浦长海店告... 听力受损还能恢复吗? 生活中很多人都会遇到这样的困扰:偶尔耳鸣、听声音模糊、近距离交谈费劲,甚至出现...
安徽省委常委、合肥市委书记费高... 安徽省委常委、合肥市委书记费高云涉嫌严重违纪违法,目前正接受中央纪委国家监委纪律审查和监察调查。
蓝绿对决白热化!民进党负面选战... 离台湾县市长选举还有半年时间,蓝绿之间的博弈日渐白热化。继民进党民代沈伯洋拿“鼠患”文章攻击台北市长...
俄安全局逮捕多名为乌收集情报的... 总台记者当地时间6日获悉,俄罗斯联邦安全局消息称,抓获5名为乌克兰情报机构工作的特工,包括4名俄罗斯...
美以官员:若僵局持续,特朗普本... 美伊目前虽然维持停火局面,但是外交谈判迟迟没有进展。美国和以色列官员说,僵局若持续,美国总统特朗普本...