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

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

这点在以前被忽略,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、角色拥有角色名表示的默认权限)。

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

最佳答案

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