7 Kasım 2017 Salı

SpringSecurity CustomAuthenticationProvider Örneği

Giriş
Açıklaması şöyle. Yani Spring Security ile kendi AuthenticationProvider nesnemi kullanabilirim.
You can implement the authentication provider and build your custom authentication. public class customAuth implements AuthenticationProvider then override the authenticate method
Kendi AuthenticationProvider nesnemi takmak için şöyle yaparız
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(myFooAuthenticationProvider);
    auth.authenticationProvider(myBarAuthenticationProvider);
  }
}
Tanımlama
Şöyle yaparız
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
  ...
}
authenticate metodu
- Eğer kullanıcının şifresi yanlış, blocklanmış vs gibi şeyleri tespit edersek AuthenticationException fırlatırız. Örneğin BadCredentialsException
- Eğer authentication işlemini pas geçmek istiyorsak null döneriz
- Eğer kullanıcıyı doğrularsak UsernamePasswordAuthenticationToken nesnesi döneriz.

Örnek
Şöyle yaparız. Kodda parametre olarak geçilen authentication nesnesine yeni değer atanıyor gibi gösterilse bile önemli değil. Sadece yeni nesne dönmek yeterli.
@Override
public Authentication authenticate(Authentication authentication) throws 
  AuthenticationException {

  String name = authentication.getName();
  String password = authentication.getCredentials().toString();
  

  List<SimpleGrantedAuthority> auths = ...;
  authentication = new UsernamePasswordAuthenticationToken(name, password, auths);
  return authentication;
}
Örnek
Şöyle yaparız.
@Component
public class DbAuthProvider implements AuthenticationProvider {
  private final UserDetailsService userDetailsService;
  private final PasswordEncoder passwordEncoder;
   ...

  @Override
  public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
    if (!StringUtils.endsWithIgnoreCase(authentication.getPrincipal().toString(),
"@dbauth.com")) {
      // this user is not supported by DB authentication
      return null;
    }
    UserDetails user = userDetailsService
.loadUserByUsername(authentication.getPrincipal().toString());
    String rawPw = authentication.getCredentials() == null ? null :
authentication.getCredentials().toString();
    if (passwordEncoder.matches(rawPw, user.getPassword())) {
      
       return new UsernamePasswordAuthenticationToken(user.getUsername(),
rawPw,Collections.emptyList());
    } else {
      throw new BadCredentialsException("Bad password");
    }
  }
  @Override
  public boolean supports(Class<?> aClass) {
    return aClass.isAssignableFrom(  }
}

Hiç yorum yok:

Yorum Gönder