近期在研究 Oauth2,由于 Security 有点遗忘,所以重新看了下,在阅读源码发现 Spring Security 中的hasAuthority()
和hasRole()
方法最终指向了同一个方法hasAnyAuthorityName()
。
这点在以前被忽略,Role
表示的应该是角色,Authority
表示的是权限,按照这里的情况,hasRole()
和hasAuthority()
最终验证的都是权限。
源码中可以发现的一点是,Role
和Authority
区别在于,Role
是没有'ROLE_'
前缀的,验证前会用defaultRolePrefix
加入。
网上很多地方的解释醒来后仔细想了下,这点应该是我考虑错了,'ROLE_'
前缀表示的角色,但是这里源码中好像不一样,也有可能我并没正确理解,这是第一个疑问。'ROLE_'
前缀表示的应该是角色的权限代码(下面已经作修改)。
但是使用hasRole()
进行校权的话,最终是通过权限(Authority
)来判断而非角色判断(Role
),UserDetails中恰好Role
和Authority
命名相同的话,使用hasRole
校权通过,否则必定失败。那么在 Spring Security User 的设计上,他们是否认为角色(Role
)也可以被认定为一种权限,甚至说是角色应该默认拥有的一项权限。
用图表来说的话。
role_name | role_code |
---|---|
管理员 | ADMIN |
用户 | USER |
permission_name | permission_code |
---|---|
管理员权限 | ROLE_ADMIN |
用户权限 | ROLE_USER |
公告编辑权限 | NOTICE_EDIT |
公告删除权限 | NOTICE_DELETE |
公告查看权限 | NOTICE_WATCH |
类似于上面两个表,关系就这里描述下,管理员默认拥有管理员权限,还拥有公告的编辑、删除权限;用户默认拥有用户权限,还拥有公告的查看权限。
第二个问题就行想问下,是否应该是这样的设计(1、两表code的命名;2、角色拥有角色名表示的默认权限)。
上面的问题主要是当时入门的文章并未详细介绍这里的内容,导致当时的理解和现在有偏差,且网上关于这个内容的我并未能够找到,所以想请教下各位这些问题,感谢解惑。
个人理解:spring security 并不关心角色或者权限,这些都是应用层的事情,它只关心是否存在权限标识符,并且提供一种非常简单的模型提供快速使用。"ROLE_ADMIN"仅仅就是一种权限标识符,没有角色,之所以这么写,主要应该是提出底层概念接口,方便应用层使用。如果要完善,需要自己编写角色 和 权限相关,最后根据角色和权限转换为权限标识符,然后在应用于spring security上。