基本比Spring Security的基本问题?

时间:2011-09-28 20:29:01

标签: spring spring-security authorization

我有一个关于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'

我很感激您的意见。

1 个答案:

答案 0 :(得分:2)

我投票给:拥有多个autorities的团体。但是使用 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")这样的真实权限,但绝不能使用真正的角色。

BTW:如果您的应用程序变大,通常仅为用户分配一个角色是不够的,那么您需要为用户分配多个角色:user --m:n--> Role --m:n--> Authority