我有一个关于 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'
我将不胜感激。
最佳答案
我投票支持:拥有拥有多项权力的团体。但对于REAL权限,例如:ROLE_MANAGE_USER、ROLE_MANAGE_STOCK、ROLE_CREATE_REPORTS,...
让我解释一下为什么基于角色的权限(无论是 Route1 还是 Route2)长期不起作用。
如果真正的用户组不是永远固定的(对于每个实际应用程序都是如此),那么您将遇到问题,在某个时间点您将需要支持一个新组,例如实习生。如果您现在已经为您的权限使用了真实的角色名称,例如“ROLE_EMPLOYEE”...那么您需要仔细检查代码并修改每一个保护受训者也应该可以使用的功能的安全声明。
但是,如果您使用真实权限作为权限,并在真实组和权限之间建立分配,那么您只需要定义新组和权限分配。
例如:
- Group_Admin:
ROLE_MANAGE_USER、ROLE_MANAGE_STOCK、ROLE_CREATE_REPORTS
- Group_Employee:
ROLE_MANAGE_STOCK、ROLE_CREATE_REPORTS
- Group_Trainee:
ROLE_CREATE_REPORTS、MAKE_COFFEE
在您的代码中,您不应该只使用像 @Secured("ROLE_MANAGE_USER")
这样的真实权限,但绝对不要使用任何尊重真实角色的内容。
顺便说一句:如果您的应用程序变得更大,仅向用户分配一个角色通常是不够的,那么您需要向用户分配多个角色:user --m:n-->角色 --m:n--> 权限
.
关于spring - 比 Spring Security 上的 Basic-est 问题还要基础?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7589204/