2

Spring Security を使用して、アプリケーション全体でログインしているユーザーの追加の詳細を保存および表示する正しい方法を探しています。

たとえば、Welcome:Mr.Smith (管理者、数学科)をすべてのページの上部に表示したいとします。このために、ログインしたユーザーの接頭辞、姓、名称、部門を取得したいと考えています。

カスタムUserDetailsサービスを使用して、データベースからユーザーを取得しています。ブラウジング中に、認証に関連する追加の詳細を保存できる があることAuthenticationがわかりました。そのメソッドを使用して追加の詳細を保存できますか?getDetails()

はいの場合、簡単な例を示してもらえますか? AuthenticationSuccessHanlderこの仕事をするために使用できますか、それとも問題を完全に間違った方法で見ていますか? 春のセキュリティレイヤーでこれを処理すべきではありませんか? どこで世話をすればいいですか?

4

2 に答える 2

5

UserDetailsService既に特定したカスタム認証プロバイダー (の実装) の必要性に加えて、フレームワークが提供するデフォルトをもう少しカスタマイズすることで、これを行うことができます。

フレームワークは、インターフェースと、クラスなどのUserDetailsいくつかの実装を提供します。User

私のアプリケーションでは、必ずしもアプリケーションのユーザーでなくても人が必要でした。

私のやり方は、すでに提供されているSpring Security を拡張しUserUserDetailsService実装でそれを返すようにすることでした。

public class RequestUserDetails 
        extends org.springframework.security.core.userdetails.User {
    private static final long serialVersionUID = -6411988532329234916L;
    private Integer personId;

    public RequestUserDetails(String username, String password, Integer personId,
            Collection<? extends GrantedAuthority> authorities) {
        super(username, password, authorities);
        this.personId = personId;
    }

    public Integer getPersonId() {
        return personId;
    }
}

+

@Service
public class UserSecurityService
    implements org.springframework.security.core.userdetails.UserDetailsService {
    [...]
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        [...]
        return new RequestUserDetails(
                userCreds.getLogin(), 
                userCreds.getPassword(),
                person.getId(),
                getAuthorities(domainUser.getRoles())
        );
    }
}

単純な使用:

  • パラメーターを使用したコントローラー レベルjavax.security.Principal(Spring MVC に関連付けられていない):

    ( (RequestUserDetails) ((Authentication)principal).getPrincipal() ).getPersonId()
    
  • パラメーターを使用して、Spring MVC@Controllerアノテーションに関連付けられたコントローラー レベルで:Authentication

    ( (RequestUserDetails)authentication.getPrincipal() ).getPersonId()
    

Spring Security に関する詳細なリファレンスが必要な場合は、 API javadocsUserDetailsにアクセスしてください。

于 2014-07-10T12:54:38.570 に答える
3

追加の詳細は、カスタム UserDetailsS​​ervice がその loadUserByName メソッドから返すカスタム UserDetails クラスのプロパティである必要があります。

于 2012-11-25T23:03:53.367 に答える