2

私のアプリケーションには、Organizationというトップレベルのエンティティがあります。ユーザーと組織の関係は多対多です。

このため、次のシナリオが考えられます。

  • UserAにはOrganizationAのロールROLE_ADMINがあります
  • UserAにはOrganizationBのロールROLE_USERがあります

UserAがOrganizationBのリソースにアクセスするときに、管理者としてアクセスしていないことを確認する必要があります。したがって、ユーザーが組織レベルで正しい役割を持っていることをさらに確認する必要があります。これを可能にするSpringSecurityに組み込まれているものはありますか?そうでない場合、これを解決するための最善の方法を誰かが知っていますか?

更新:もう少し情報...

ユーザーがログインして、操作する組織を選択します。それはセッションに保存されます。それを超えると、URLはSecuredアノテーションでロックダウンされます。つまり、UserAがログインしてOrgAを選択した場合、/ admin / user / createにアクセスできるはずですが、ログインしてOrgBを選択した場合は、そのURLにアクセスできないはずです。

長い道のりは、これが重要なすべてのメソッドにチェックを追加することです。したがって、「わかりました。あなたはOrgAの管理者ですが、OrgBの管理者ではなく、OrgBを使用してログインしているので、このリクエストを拒否してください」というサービスメソッドを呼び出します。

私はこれを処理するためのより多くのGrails/Spring-Securityの方法を望んでいます。

4

2 に答える 2

2

おそらく、カスタムを使用してこれを行うことができますAccessDecisionVoter。このvoteメソッドは、リソース(メソッドまたはURL)の「構成属性」を提供します。これは通常、必要なロールであり、Authenticationオブジェクトから直接、または現在の組織を読み取ることにより、現在のユーザーのロール/権限を取得できます。ユーザーに適切な役割を選択します。

ユーザーが選択した組織に基づいて、ユーザーの役割を区別する方法があると思います。

RoleVoter基本的に、組織を考慮に入れた標準の拡張バージョンを作成することになります。

于 2012-06-06T14:52:30.900 に答える
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
}
于 2017-07-17T23:33:00.353 に答える