Giriş
Spring Security'nin iki tane amacı var.
Spring Security'nin iki tane amacı var.
1. Authentication
2. Authorization
Açıklaması şöyle. 
   
Örnek - Custom UserDetailsService Takma
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.
  authenticationProvider metodu
Bu sınıfın içindeki authenticationProviders dizine yeni bir AuthenticationProvider nesnesi ekler.
Örnek
Şöyle yaparız.
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
Şöyle yaparız
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
Şöyle yaparız.
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
  @Override 
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(...).passwordEncoder(...); 
  } 
  ...
} Örnek - Custom AuthenticationTokenProvider Takma
Custom AuthenticationProvider Nesnesi yazısına taşıdım
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);
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()
    ...
}Şöyle yaparız
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  auth.parentAuthenticationManager(authenticationManagerBean())
    .inMemoryAuthentication()
    .withUser("admin")
    .password("admin")
    .roles("USER");
}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 {
    ...
  }
  ...
}
@Autowired
@Qualifier("userDetailsService")
UserDetailsService userDetailsService;
@Bean
public PasswordEncoder passwordEncoder(){
  PasswordEncoder encoder = new BCryptPasswordEncoder();
  return encoder;
}
AuthenticationManagerBuilder auth = ...;
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());Şö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