【问题标题】:Spring Security User Roles Per Organization每个组织的 Spring Security 用户角色
【发布时间】:2012-06-08 03:45:22
【问题描述】:

在我的应用程序中,我有一个名为组织的顶级实体。用户和组织之间的关系是多对多的。

因此,我可能会遇到以下情况:

  • UserA 具有 OrganizationA 的角色 ROLE_ADMIN
  • UserA 具有 OrganizationB 的角色 ROLE_USER

我需要确保当用户 A 访问组织 B 的资源时,他不是以管理员身份进行的。因此,我需要额外检查用户是否在组织级别具有正确的角色。 Spring Security 中是否有任何内置功能允许这样做?如果没有,有谁知道解决这个问题的最佳方法是什么?

更新:更多信息...

用户登录并选择他们想要合作的组织。那存储在会话中。除此之外,URL 被 Secured 注释锁定。这意味着如果 UserA 登录并选择 OrgA,他们应该能够访问 /admin/user/create,但是,如果他们登录并选择 OrgB,他们不应该访问该 URL。

漫长的道路是在每个重要的方法中添加额外的检查。所以调用一些服务方法,上面写着“好的,你是 OrgA 的管理员,但不是 OrgB 的管理员,并且你使用 OrgB 登录,所以拒绝这个请求”。

我希望有更多的 grails / spring-security 方式来处理这个问题。

【问题讨论】:

  • 您可能需要在此处提供更多信息,否则很难提出具体的方法。例如,不同组织的资源有什么区别?
  • 作为管理员或组织A,我可以创建用户。我不想允许组织 B 上的用户 A 这样做。那种东西。
  • 好吧,我应该说的是“你的应用如何区分不同的资源?”在这种情况下,什么是“资源”?例如,您是否对不同的组织使用不同的 URL?
  • 我已更新我的问题以添加这一点细节。谢谢。

标签: grails spring-security


【解决方案1】:

我想我来晚了,但这对我有用:

选择组织后,您可以在会话中设置具有新角色的新身份验证对象(之前的身份验证对象无效)。像这样的:

@RequestMapping(value = "/org-a")
String orgA(HttpServletRequest request) {
    request.getSession().setAttribute("org", "org-a")
    Organization org = new Organization("org-a")
    reloadRolesForAuthenticatedUser(org)
    ....
}

private void reloadRolesForAuthenticatedUser(Organization org) {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication()
    List<String> newRoles = getRoles(auth.getPrincipal().getUsername(), org)
    List<GrantedAuthority> authorities = getAuthorities(newRoles)
    Authentication newAuth = new UsernamePasswordAuthenticationToken(auth.getPrincipal(),auth.getCredentials(),authorities)
    SecurityContextHolder.getContext().setAuthentication(newAuth)
}


private List<GrantedAuthority> getAuthorities(List<String> roles) {
    List<GrantedAuthority> auths = new ArrayList<GrantedAuthority>()
    if (!roles.isEmpty()) {
        for (String r : roles) {
            auths.add(new SimpleGrantedAuthority(r))
        }
    }
    return auths
}

【讨论】:

    【解决方案2】:

    您可能可以通过使用自定义AccessDecisionVoter 来做到这一点。 vote 方法将为您提供资源(方法或 URL)的“配置属性”,通常是所需的角色,您可以直接从 Authentication 对象获取当前用户的角色/权限,或者通过阅读当前组织并为用户选择适当的角色。

    我假设您有一些方法可以根据用户选择的组织来区分用户的角色。

    基本上,您将编写标准RoleVoter 的扩展版本,其中考虑了组织。

    【讨论】:

    • 啊,好的。这是有道理的。我会试一试并报告。感谢您的信息。
    猜你喜欢
    • 2011-08-02
    • 2011-07-21
    • 2011-03-12
    • 2016-10-14
    • 1970-01-01
    • 2021-12-06
    • 2019-02-13
    • 2013-02-06
    • 2014-01-31
    相关资源
    最近更新 更多