【问题标题】:Role and permission custom Model角色和权限自定义模型
【发布时间】:2013-09-03 08:24:16
【问题描述】:

我有一个自定义的自动化模型,我想用 Spring Security 来表示:

我有角色和权限的概念:

@Entity
public class User
...............
@ManyToMany
@Column
private Set<Role> roles;


@ManyToMany
@Column
private Set<Permission> permissions;
  }

在我的自定义 UserdetailsS​​ervice 中,我有一种干净的方式来加载角色,但我找不到任何方式和 spring-security 中与权限相关的任何组件:

public class BELUserDetailService implements UserDetailsService {

 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
 User connectedUser = userRepositoy.findUserByUsername(username);

     Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
    for (Role r :connectedUser.getRoles()) {
        authorities.add(new SimpleGrantedAuthority(r.getRoleAWB().name()));
    }


    BELUserDetails belUserDetails = new BELUserDetails(connectedUser.getIdUser(), authorities);
.....
....
    }

}

我的角色是:

管理员 普通用户 交易用户

我的权限是: VALIDATE_TRANSATION INIT_TRANSACTION

功能用例是,如果您想要验证交易,您必须拥有 ROLE TRANSACTION USER 和权限 VALIDATE_TRANSACTION。

hasRole("ROLE_TRANSACTION_USER") and hasPermission("VALIDATE_TRANSACTION")

另一个重要的情况是,如果用户具有角色“ROLE_TRANSACTION_USER”和权限 VALIDATE_TRANSACTION ,我希望将来在尝试验证交易时使用 PermissionEvaluator 设置一些限制,他还必须具有大于金额的 Amountlimit PermissionEvaluator 的交易和这个功能非常酷

这就是为什么我需要同时实现角色和权限概念

我将如何将我的权限添加到 spring-security 的标准流程中。

提前致谢。

【问题讨论】:

  • 你能举一些权限的例子吗?
  • 我用我的角色和权限的一些示例更新了帖子
  • 另一种情况是,如果用户具有角色 "ROLE_TRANSACTION_USER" 和权限 VALIDATE_TRANSACTION ,我希望将来在尝试验证交易时使用 PermissionEvaluator 设置一些限制,他还必须具有更大的 Amountlimit比交易的金额和 PermissionEvaluator 的这个功能非常酷。

标签: spring spring-security


【解决方案1】:

默认情况下,您在 Spring Security 中只有权限。只需将您的所有角色和权限添加到权限集合中。然后你可以这样做:

hasRole("ROLE_TRANSACTION_USER") and hasRole("VALIDATE_TRANSACTION")

在大多数情况下,将两者混合是没有问题的。

您在Spring Security ACL module 中拥有权限,但仅当您希望每个域对象具有不同的安全规则时才需要 ACL。

编辑。我认为进行一些额外安全检查的最简单方法是使用 SpEL。示例:

@PreAuthorize("hasRole('ROLE_TRANSACTION_USER') 
     and hasRole('VALIDATE_TRANSACTION') 
     and @amountValidatorServiceBean.isAmountValidForCurrentUser(#amount)")
public void doTransaction(Integer amount, ...)

【讨论】:

  • 将 VALIDATE_TRANSACTION 视为角色的问题在于,我们将无法使用自定义 PermissionEvaluator 来测试用户是否有权验证给定金额的交易。
  • 在使用SpEL的注解中直接调用一些验证逻辑可能更容易。请参阅我的答案中的详细信息。
  • 感谢我将实施此解决方案
猜你喜欢
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多