spring - 比 Spring Security 上的 Basic-est 问题还要基础?

标签 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'

我将不胜感激。

最佳答案

我投票支持:拥有拥有多项权力的团体。但对于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/

相关文章:

asp.net - <authorization> 节点的 Web.config 错误

java - 在 Spring+JPA 中更新级联子级时出现 UnsupportedOperationException

java - Hibernate更新记录并实现监听器: getting only required attribute values for event. getOldState()

java - Spring Hibernate Jpa 错误 : root cause java. lang.IllegalArgumentException: Unknown parameter position: 1

spring - 使用 JdbcStore 时配置 JWT token 过期时间

spring - 从 HttpServletResponse 返回 HAL json

spring - Azure 服务总线 - Spring Boot 禁用自动启动 (com.microsoft.azure : azure-servicebus-spring-boot-starter)

SpringBoot 应用程序 - 服务器上下文路径

security - HBase错误禁用安全特性不可用

c# - CustomAuthorizeAttribute - HttpActionContext 而不是 AuthorizationContext