关于Spring Security 中 User 的设计上的问题

发布于 2022-09-12 13:16:21 字数 1662 浏览 21 评论 0

近期在研究 Oauth2,由于 Security 有点遗忘,所以重新看了下,在阅读源码发现 Spring Security 中的hasAuthority()hasRole()方法最终指向了同一个方法hasAnyAuthorityName()

image.png

这点在以前被忽略,Role表示的应该是角色,Authority表示的是权限,按照这里的情况,hasRole()hasAuthority()最终验证的都是权限。

源码中可以发现的一点是,RoleAuthority区别在于,Role是没有'ROLE_'前缀的,验证前会用defaultRolePrefix加入。

网上很多地方的解释'ROLE_'前缀表示的角色,但是这里源码中好像不一样,也有可能我并没正确理解,这是第一个疑问。醒来后仔细想了下,这点应该是我考虑错了,'ROLE_'前缀表示的应该是角色的权限代码(下面已经作修改)。

但是使用hasRole()进行校权的话,最终是通过权限(Authority)来判断而非角色判断(Role),UserDetails中恰好RoleAuthority命名相同的话,使用hasRole校权通过,否则必定失败。那么在 Spring Security User 的设计上,他们是否认为角色(Role)也可以被认定为一种权限,甚至说是角色应该默认拥有的一项权限。

用图表来说的话。

role_namerole_code
管理员ADMIN
用户USER
permission_namepermission_code
管理员权限ROLE_ADMIN
用户权限ROLE_USER
公告编辑权限NOTICE_EDIT
公告删除权限NOTICE_DELETE
公告查看权限NOTICE_WATCH

类似于上面两个表,关系就这里描述下,管理员默认拥有管理员权限,还拥有公告的编辑、删除权限;用户默认拥有用户权限,还拥有公告的查看权限。

第二个问题就行想问下,是否应该是这样的设计(1、两表code的命名;2、角色拥有角色名表示的默认权限)。

上面的问题主要是当时入门的文章并未详细介绍这里的内容,导致当时的理解和现在有偏差,且网上关于这个内容的我并未能够找到,所以想请教下各位这些问题,感谢解惑。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云归处 2022-09-19 13:16:21

个人理解:spring security 并不关心角色或者权限,这些都是应用层的事情,它只关心是否存在权限标识符,并且提供一种非常简单的模型提供快速使用。"ROLE_ADMIN"仅仅就是一种权限标识符,没有角色,之所以这么写,主要应该是提出底层概念接口,方便应用层使用。如果要完善,需要自己编写角色 和 权限相关,最后根据角色和权限转换为权限标识符,然后在应用于spring security上。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文