2011-12-16 18 views
8

私は自分のアプリケーションでSpring Securityを実装しました。デフォルト実装を使用しました。つまり、独自のパラメータ(DataSource、Secured Areasなど)で設定しましたが、カスタム実装は記述していません。User - Spring Securityより詳しい情報を入手

は今、私はなど、会社名、ID、同様に、それはユーザ名とパスワードと同じテーブルの上で、利用者からのより多くのデータをキャプチャしたいしかし、私がログインするためにこの情報を使用して行う必要はありません。

私はそれを行うかどうかはわかりません。私が読んだことから、それはUserDetailsS​​erviceに関連しています。しかし、ログイン中にこの情報を使用したい場合は、Custom UserDetailsS​​erviceを作成する必要があります。これは私が望むものではありません。ユーザーがログインした後、私は、アプリケーション内でこの情報を使用します。

は、それが本当にUserDetailsS​​erverに関連していますか?これは私が改造しなければならない唯一のファイルですか?私はカスタムUserDetailsS​​erviceの見つけ

すべての例では、単にユーザー名とパスワードを使用するので、新しいデータが入ってくるだろうどこ私は理解することはできません。

感謝を! UserDetailsS​​erviceをオーバーライド

答えて

14

は、あなたがあなた自身のUserDetailsS​​erviceを実装する必要がありますし、自分UserDetailsオブジェクト..私たちがやったことです:

public class CustomService implements UserDetailsService { 
    @Transactional(readOnly = true) 
    public UserDetails loadUserByUsername(String username) { 

     Account account = accountDAO.findAccountByName(username); 

     if (account == null) { 
      throw new UsernameNotFoundException("account name not found"); 
     } 
     return buildUserFromAccount(account); 
    } 


    @SuppressWarnings("unchecked") 
    @Transactional(readOnly = true) 
    private User buildUserFromAccount(Account account) { 

     String username = account.getUsername(); 
     String password = account.getPassword(); 
     boolean enabled = account.getEnabled(); 
     boolean accountNonExpired = account.getAccountNonExpired(); 
     boolean credentialsNonExpired = account.getCredentialsNonExpired(); 
     boolean accountNonLocked = account.getAccountNonLocked(); 

     // additional information goes here 
     String companyName = companyDAO.getCompanyName(account); 


     Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
     for (Role role : account.getRoles()) { 
      authorities.add(new SimpleGrantedAuthority(role.getName())); 
     } 

     CustomUserDetails user = new CustomUserDetails (username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, 
       authorities, company); 

     return user; 
    } 


public class CustomUserDetails extends User{ 

    // ... 
    public CustomUserDetails(..., String company){ 
     super(...); 
     this.company = company; 
    } 

    private String company; 

    public String getCompany() { return company;} 

    public void setCompany(String company) { this.company = company;} 
} 
+0

'loadUserByUsername'がUserDetailsを返しますが、コードでは、それは' buildUserFromAccount'を返します。ユーザーを返します。では、CustomUserDetailsがコードにどのように関係していますか?アカウントのDAOクラスとそのすべてのメソッドは、私によって実装される必要があります、正しい? –

+0

少しのタイプミスがあってそれを修正しました。さらに説明すると、「UserDetails」はインターフェース、「User」はすべての基本フィールドを含む春証券実装です。独自のフィールドを追加したい場合、最も簡単なのは 'User'を拡張することです。そのメソッドで 'User'オブジェクトを返すことも、' UserDetails'オブジェクトや 'CustomUserDetails'オブジェクトを返すこともできます。これは、春のセキュリティが' UserDetails'を実装するオブジェクトを期待しているからです。 – Pete

+0

ああ、OK!これを使用して、私はSpring Securityが認証する必要があるすべてのものを提供しています。ただし、保持しているUserオブジェクトにはすべてのカスタムフィールドがあります。だから、どうすればこのオブジェクトを得ることができるのですか?たとえば、getCompany'はできますか? –

関連する問題