私は春のセキュリティフレームワークの周りに私の頭をラップし、AuthenticationProvider
春認証が最初に成功し、2回実施し、その後、失敗し
私はセキュリティで保護されたURLと、正しい資格情報を使用してフォーム・ログインに移動し、2つのカスタムを使用して認証を実装しようとしていますログイン試行が行われます。最初は成功し、2番目は失敗し、ブラウザはエラーメッセージなしでログインページにとどまります。
ここに私のセキュリティ設定があります。
package training2;
{ imports... }
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("myProvider")
private AuthenticationProvider provider;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(provider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.permitAll()
.and()
.logout()
.permitAll();
}
@Override
public UserDetailsService userDetailsServiceBean() throws Exception {
// TODO Auto-generated method stub
return super.userDetailsServiceBean();
}
@Override
@Bean
protected UserDetailsService userDetailsService() {
return new UserDetailsService() {
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
System.out.println("loadUserByUsername");
return new UserDetails() {
private static final long serialVersionUID = -1044116648365271684L;
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return true;
}
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return true;
}
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return true;
}
public String getUsername() {
// TODO Auto-generated method stub
return username;
}
public String getPassword() {
// TODO Auto-generated method stub
return "asdf";
}
public Collection<? extends GrantedAuthority> getAuthorities() {
// TODO Auto-generated method stub
return null;
}
};
}
};
}
@Bean
@Qualifier("myProvider")
public AuthenticationProvider myProvider(final UserDetailsService userDetailsService) {
return new AuthenticationProvider() {
public boolean supports(Class<?> authentication) {
return true;
}
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
System.out.println("authenticate");
UserDetails user = userDetailsService.loadUserByUsername(authentication.getName());
if (user != null && user.getPassword().equals(authentication.getCredentials())) {
System.out.println("authentication ok");
return authentication;
} else {
System.out.println("authentication failed");
throw new AuthenticationException(null) {
private static final long serialVersionUID = -1022654748424786317L;
};
}
}
};
}
}
そして次は、有効な資格情報
authenticate
loadUserByUsername
authentication ok
authenticate
loadUserByUsername
authentication failed
にログインしようとすると、無効な資格情報(空自以外のパスワード何でも)でログインしようとするとき、認証が行われ、コンソールにプリントアウトされます一度だけ、失敗する必要があります。
なぜ、フォームのログイン時に2回認証が行われるのですか?最初に成功してから失敗します。何かが間違って設定されているのですか?また、カスタムAuthenticationProvider
の実装を使用する場合は、SecurityContext
を手動で管理する必要がありますか、それともSpringがそれを管理していますか?
私はまた、がこのメソッドを宣言しているにもかかわらず、メソッドを明示的に注釈しなければならない理由は、@Bean
がSpring管理であるためです。
「認証」を変更した他のコードはありますか?理由を2回説明することはできますが、2回目の失敗が失敗する理由はわかりません。 – chaoluo