まず、2つのアプローチは異なる目的で使用されており、互換性がありません。
ケース1:
UserDetailsService
は、ユーザーを認証あなたの認証でユーザー情報を検索するDAOとして純粋に使用し、その情報に基づいており、認証はUserDetailsService
、単にデータアクセス内で行われるべきではありません。 仕様にはっきりと記載されています。これはあなたが探しているものです。
ケース2:あなたは、あなたが行うことができ、カスタムのログイン名とパスワード以外の分野で認証する場合
AuthentictionProvider
一方では、例えば、認証のカスタムメソッドを提供するために使用されるAuthentictionProvider
を実装し、このオブジェクトを供給することにより、 AuthenticationManagerBuilder
に私はこれがあなたのプロジェクトでやりたいことだとは思わない。デフォルトの方法であるログインとパスワードを使用して、データベースに格納されたユーザーに基づいて認証を実装しようとしているだけです。上記で ケースあなただけUserDetailsService
、AuthentictionProvider
のインスタンスはコンテナによってAuthenticationManager
であなたのために作成された、あなたは認証用のユーザーをretriveするために使用されているシステムでは何もなく、DAOではありませんUserDetailsServiceを供給するので、それはDaoAuthenticationProvider
をした実装1 。お使いの設定であなたの実装に今
、 の代わりに:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// auth.userDetailsService(new AdminSecurityService());
auth.authenticationProvider(new AdminSecurityAuthenticationProvider());
}
はもちろんのorg.springframework.security.core.userdetails.UserDetailsService
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final AdminRepository userRepository;
@Autowired
public CustomUserDetailsService(AdminRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Admin user = userRepository.findByLogin(username);
if (user == null) {
throw new UsernameNotFoundException(String.format("User %s does not exist!", username));
}
return new UserRepositoryUserDetails(user);
}
private final static class UserRepositoryUserDetails extends Admin implements UserDetails {
private static final long serialVersionUID = 1L;
private UserRepositoryUserDetails(User user) {
super(user);
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return AuthorityUtils.createAuthorityList("ROLE_USER");
}
@Override
public String getUsername() {
return getLogin();//inherited from user
}
@Override
public boolean isAccountNonExpired() {
return true;//not for production just to show concept
}
@Override
public boolean isAccountNonLocked() {
return true;//not for production just to show concept
}
@Override
public boolean isCredentialsNonExpired() {
return true;//not for production just to show concept
}
@Override
public boolean isEnabled() {
return true;//not for production just to show concept
}
//getPassword() is already implemented in User.class
}
}
を実装しており、この
@Autowired
private CustomUserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
とあなたのCustomUserDetailsService
ような何かを行います実装が上がっている取得したユーザー(あなたの場合はAdmin.class)に基づいて、そのユーザーのパスワードとそのインターフェイスの残りのメソッドを提供する必要があります。それが役に立てば幸い。私はこの例を実行していないので、いくつかのタイプミスをして、何かがうまくいかないかどうか尋ねてみましょう。私はまたあなたがそれを必要としない場合は、あなたのプロジェクトから 'AuthentictionProvider'を取り除くでしょう。コメントの後http://docs.spring.io/spring-security/site/docs/4.0.0.RC1/reference/htmlsingle/#tech-userdetailsservice
:
ここでは、ドキュメントを得た をあなただけやるあまり手間をかけずにあなたのconfigureメソッドでPasswordEncoder
を設定することができます。あなたがアクセスを取得するので
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
@Bean
public PasswordEncoder passwordEncoder(){
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
をあなたはそれを行うことができますAbstractDaoAuthenticationConfigurer
はauth.userDetailsService(userDetailsService)
から返され、の使用を選択した場合は、DaoAuthenticationProvider
を設定することができます。 あなたはPasswordEncoder
がAuthenticationProvider
に設定されている権利ですが、あなただけのauth.userDetailsService(userDetailsService)
から返されconvineinceオブジェクトを使用し、すでにあなたのために作成されたあなたのケースDaoAuthenticationProvider
にAuthenticationPriovider
に渡します、そのオブジェクト上のエンコーダを設定AuthenticationProvider
を実装 する必要はありません。 コメントに記載されているロードランナーのように、ごくまれに独自に実装する必要があるのは、AuthenticationProvider
です。AbstractDaoAuthenticationConfigurer
を使用して認証設定の調整をほとんど行うことができます。から返されます。
"パスワードの暗号化を追加したかったのですが、ユーザーがロックされているかどうかを確認したり、ユーザーがまだログインしていないかどうかなど(パスワードハッシュを除く) )は、AuthenticationProviderを使用します。
あなたは上記の方法のいずれかを返す場合はfalse認証が失敗することがわかりますUserDetails
インターフェースを見ればありません、これは標準の認証メカニズム http://docs.spring.io/autorepo/docs/spring-security/3.2.0.RELEASE/apidocs/org/springframework/security/core/userdetails/UserDetails.html の一環として、あなたのために行われます。 非常に非標準的なケースでは、AuthenticationProvider
の実装が本当に必要です。すべての標準的なものは、フレームワークによってかなり覆われています。
あなたのbitbucketリンクは無効です –