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);
inMemoryAuthentication metoduInMemoryUserDetailsManagerConfigurer 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 metoduKullanı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