21 Ağustos 2020 Cuma

SpringSecurity AuthenticationManagerBuilder Sınıfı - Custom AuthenticationProvider Nesnesi Takılabilir

Giriş
Spring Security'nin iki tane amacı var. 
1. Authentication
2. Authorization
Açıklaması şöyle
Spring Security is split into two components
*Authentication – Defined by AuthenticationManager, or the source of the authentication credentials
*Authorisation – what we want to protect – URL’s, Roles, method
Authentication İşlemi
Authentication işleminde amaç kullanıcıyı doğrulamaktır. Kullanıcıyı doğrulamak için ise bir adet AuthenticationManager arayüzünü gerçekleştiren nesneye ihtiyaç var. Bu sınıfın ismi ProviderManager.
   
ProviderManager nesnesine AuthenticationProvider nesneleri takılır. AuthenticationProvider arayüzünü geçekleştiren bir sürü hazır sınıf var. Ve hatta kendi AuthenticationProvider nesnemizi bile yazabiliriz. CustomAuthenticationProvider Örneği yazısına bakabilirsiniz.

Hazır AuthenticationProvider nesnelerinin özelliklerinin atanması gerekir. Bu iş için XXXConfigurer sınıfları kullanılır. Bu sınıf Configurer sınıflarını kolayca elde edebileceğimiz metodlar sunar.  

WebSecurityConfigurerAdapter İle İlişkisi
Bu sınıf WebSecurityConfigurerAdapter tarafından kullanılır.

Örnek - Custom UserDetailsService Takma 
Şöyle yaparız.
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

  @Override 
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(...).passwordEncoder(...); 
  } 
  ...

} 
Örnek - Custom AuthenticationTokenProvider Takma

authenticationProvider metodu
Bu sınıfın içindeki authenticationProviders dizine yeni bir AuthenticationProvider nesnesi ekler.

Örnek
Şöyle yaparız.
@Autowired
private UserService userService; // implements AuthenticationUserDetailsService...

AuthenticationManagerBuilder auth = ...;

PreAuthenticatedAuthenticationProvider paaProvider = 
  new PreAuthenticatedAuthenticationProvider();
paaProvider.setPreAuthenticatedUserDetailsService(userService);
auth.authenticationProvider(paaProvider);
inMemoryAuthentication metodu
InMemoryUserDetailsManagerConfigurer nesnesi döner. Bu nesne bir DaoAuthenticationProvider döner. DaoAuthenticaitonProvider içinde InMemoryUserDetailsManager vardır.

jdbcAuthentication metodu
JdbcUserDetailsManagerConfigurer nesnesi döner. Bu nesne bir DaoAuthenticationProvider döner. DaoAuthenticaitonProvider içinde JdbcUserDetailsManager vardır.

ldapAuthentication metodu
LdapAuthenticationProviderConfigurer nesnesi döner. Şöyle yaparız
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  auth.ldapAuthentication()
    ...
}
parentAuthenticationManager metodu
Şöyle yaparız
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

  auth.parentAuthenticationManager(authenticationManagerBean())
    .inMemoryAuthentication()
    .withUser("admin")
    .password("admin")
    .roles("USER");
}
userDetailsService metodu
Kullanıcıyı belirtilen kaynaktan yükler. UserDetailsService arayüzünü gerçekleştiren bir sınıf olabilir.
Örnek
Elimizde şöyle bir kod olsun
@Transactional
@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {

  @Transactional(readOnly=true)
  public UserDetails loadUserByUsername(final String username) 
  throws UsernameNotFoundException {
    ...
  }
  ...
}
Şöyle yaparız.
@Autowired
@Qualifier("userDetailsService")
UserDetailsService userDetailsService;


@Bean
public PasswordEncoder passwordEncoder(){
  PasswordEncoder encoder = new BCryptPasswordEncoder();
  return encoder;
}

AuthenticationManagerBuilder auth = ...;
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
Örnek
Şöyle yaparız.
AuthenticationManagerBuilder auth = ...;

auth.userDetailsService(userDetailsService)
  .passwordEncoder(getPasswordEncoder()); 


private PasswordEncoder getPasswordEncoder() { 
  return new PasswordEncoder() { 
    @Override 
    public String encode(CharSequence charSequence) {
      return charSequence.toString();
    } 

    @Override 
    public boolean matches(CharSequence charSequence, String s) {
      return true; 
    } 
  }; 
} 





Hiç yorum yok:

Yorum Gönder