2

Spring Security を使用して、webapp に認証と承認を提供しています。

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;でログインする標準的な方法を使用しますDaoAuthenticationProvider

ログインに成功すると、次の 2 つの方法でユーザーの権限にアクセスできます。

1#SecurityContextHolder.getContext().getAuthentication().getAuthorities()

2#((UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getAuthorities()

Authentication インスタンス権限リストは UserDetails の user.getAuthorities() から構築されるため、これらは同じであると想定されていますが、実際には 2 つの異なる Collection インスタンスです。プリンシパルのものは UnmodifiableSet で、Authentication インスタンスのものは UnmodifiableRandomAccessList です。同じ権限リストを含む 2 つの異なる Collection インスタンス。

これは、現在認証されているプリンシパルに権限を動的に追加するソリューションを見つけようとしているときに私を驚かせました。これは良いことではありません。セキュリティ レイヤーで許可されるべきではありませんが、それでも私が必要としているのはそれです。

私が受け入れられると思った解決策は、現在認証されているユーザーでプログラムからログインすることでした new UsernamePasswordAuthenticationToken(authentication.getPrincipal(), authentication.getCredentials(), dbAuthsSet);

authentication現在の認証インスタンスとdbAuthSet現在の権限のリスト + 追加する必要があるものです。

そして、これはうまくいきます。今唯一奇妙なことは、

1#SecurityContextHolder.getContext().getAuthentication().getAuthorities()

2#((UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getAuthorities()

もう同じ権限のリストを返さないでください。

アプリケーションで認証のリストに対して権限をチェックする場合、私は問題なく、これは完全に正当化されることです。しかし、プリンシパルのリストを確認すると、矛盾に直面しています。

どう思いますか?Spring の Security 3.2 で対処すべき問題ですか?

new UsernamePasswordAuthenticationToken()セッションで現在認証されているユーザーに追加の権限を与えるという私の目標を達成するために、プログラムでログインすることは妥当だと思いますか?

Spring のRun-As Authentication Replacement機能を使用するのは良いケースでしょうか? 誰でもこれに関する経験を共有できますか?

4

0 に答える 0