我有一个关于Spring安全性的非常基本的问题,但是这个问题可以推广到任何授权方案:
组是否应该拥有单一权限,而用户可能是多个组的成员? 要么 一个组可能有多个权限,用户可能只被分配到一个组?
我需要用户拥有以下三个权限:ROLE_ADMIN,ROLE_MANAGER,ROLE_EMPLOYEE。
以下表格结构更详细地说明了这个问题:
路线1。
GROUP TABLE
===========
ID, NAME
1, 'Admins'
2, 'Managers'
3, 'Employees'
GROUP_AUTHORITY TABLE
=====================
GROUP_ID, AUTHORITY
1, 'ROLE_ADMIN'
1, 'ROLE_MANAGER'
1, 'ROLE_EMPLOYEE'
2, 'ROLE_MANAGER'
2, 'ROLE_EMPLOYEE'
3, 'ROLE_EMPLOYEE'
GROUP_MEMBER TABLE
==================
GROUP_ID, USERS_ID
1, 1
USERS TABLE
===========
USERS_ID, NAME
1, 'John Admin'
// -------------------------------------------
路线2:
GROUP TABLE
===========
ID, NAME
1, 'Admins'
2, 'Managers'
3, 'Employees'
GROUP_AUTHORITY TABLE
=====================
GROUP_ID, AUTHORITY
1, 'ROLE_ADMIN'
2, 'ROLE_MANAGER'
3, 'ROLE_EMPLOYEE'
GROUP_MEMBER TABLE
==================
GROUP_ID, USERS_ID
1, 1
2, 1
3, 1
USERS TABLE
===========
USERS_ID, NAME
1, 'John Admin'
我很感激您的意见。
答案 0 :(得分:2)
我投票给:拥有多个autorities的团体。但是使用 REAL 权限,如:ROLE_MANAGE_USER,ROLE_MANAGE_STOCK,ROLE_CREATE_REPORTS,......
让我解释一下为什么基于角色的权限(无论是Route1还是Route2)长期不起作用。
如果真正的用户组永远不会被修复(那就是每个真实应用程序),那么你就会遇到问题,在某些时候你需要支持一个新的组,例如实习生。如果您现在已经为您的权限使用了真实的角色名称,例如“ROLE_EMPLOYEE”......那么您需要查看代码并修改每个安全语句,以保护应该为受训者提供的功能。
但是如果您使用真实权限进行授权,并在真实组和权限之间建立分配,那么您只需要定义新组和对作者的分配。
例如:
ROLE_MANAGE_USER, ROLE_MANAGE_STOCK, ROLE_CREATE_REPORTS
ROLE_MANAGE_STOCK, ROLE_CREATE_REPORTS
ROLE_CREATE_REPORTS, MAKE_COFFEE
在您的代码中,您应该只使用像@Secured("ROLE_MANAGE_USER")
这样的真实权限,但绝不能使用真正的角色。
BTW:如果您的应用程序变大,通常仅为用户分配一个角色是不够的,那么您需要为用户分配多个角色:user --m:n--> Role --m:n--> Authority
。