1

私のアプリケーションでは、通常、アクセス管理用に 3 つのテーブルを作成します。役割、権利、および役割と権利の間をマッピングする関連テーブル。

私はこのアプローチを Spring セキュリティに翻訳しようとしていますが、[この記事][1] を読んだ後、正しい道を進んでいると思いました。カスタム AuthenticationProvider を作成し、authenticate()次のようにメソッドを実装しました。

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    UserProfile profile = userProfileService.findByEmail(authentication.getPrincipal().toString());

    if(profile == null){
        throw new UsernameNotFoundException(String.format("Invalid credentials", authentication.getPrincipal()));
    }

    String suppliedPasswordHash = DigestUtils.shaHex(authentication.getCredentials().toString());

    if(!profile.getPasswordHash().equals(suppliedPasswordHash)){
        throw new BadCredentialsException("Invalid credentials");
    }

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(profile, null, profile.getAuthorities());

    return token;
}

このprofile.getAuthorities()メソッドは、権利のリストを作成します (権利は、GrantedAuthority の独自の実装でラップされます)。したがって、このリストを使用して UsernamePasswordAuthenticationToken オブジェクトが作成されます。これは、これを処理する UserProfile.getGrantedAuthorities() メソッドです。

public Collection<? extends GrantedAuthority> getAuthorities() {
    Set<ProduxAuthority> authorities = new HashSet<ProduxAuthority>();
    for (Role role : roles) {
        for (Right right : role.getRights()) {
            ProduxAuthority produxAuthority = new ProduxAuthority(right.getName());
            authorities.add(produxAuthority);
        }
    }
    return authorities;
}

私の質問は、これが正しいアプローチかどうかです。権限の代わりに GrantedAuthorities にロールを詰め込む必要があるという印象を受けていますが、権限を使用してメソッドと URL を保護したいと考えています。どうすればこれを達成できますか? そして、Spring の ROLE と PERMISSION の違いは何ですか? パーミッションは権利にマップされますか? hasPermission() を使用して、役割ではなく権利に基づいて物事を保護できますか?

4

1 に答える 1

3

私は再び自分の質問に答えるつもりです:

Spring は、hasPermission メソッドで使用される権利とパーミッションを認識していません。Spring セキュリティの比較的複雑なドメイン オブジェクト セキュリティ/ACL にのみ適用されます。Spring の単純なセキュリティは、ロールとロール、またはより一般的な「パーミッション」 (一般的な意味で、Domain Object Security/ACL のパーミッションと混同しないでください) のみを認識します。たとえば、IS_AUTHENTICATED_ANONYMOUSLY は、Authentication の 3 番目のコンストラクター パラメーターで Spring に渡されます。オブジェクトの。

私は自分の Web サイトですべてを要約し、権限をロールに詰め込む実装例を作成しました。これにより、依然としてかなり柔軟に管理できます。

http://en.tekstenuitleg.net/blog/spring-security-with-roles-and-rights

于 2012-11-06T19:06:19.110 に答える