Spring Security In-Memory Authentication ve Authorization
Spring Security Dersleri‘ne devam ediyorum.
Bu yazıda yazılımımızın üzerinde hafızada tutularak yapılan erişim ve yetkilendirme işleminin nasıl yapıldığından bahsedeceğim.
In-Memory Authentication ve Authorization uygulamanın bellek içerisinde Spring Security’de kimlik doğrulamayı işlemenin yoludur. Bu yöntemde roller, parolalar ve kullanıcı adı gibi bilgileri bellek üzerinde Spring uygulamamız çalışana kadar doğrulama yapabiliriz.
Bu yöntemin bir dezavantajı bulunmaktadır sunucu durdurulursa, bellek temizlenir ve doğrulama yapamayız. Bu yöntem genellikle sabit kullanıcı ve sabit rolleri olan fazla kullanıcısı bulunmayan projeler için rahatlıkla kullanılabilir.
Projemizi oluşturalım, bunun için bağımlılıklarımız aşağıdaki gibi olacaktır.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Code language: HTML, XML (xml)
Endpointlerimizi oluşturalım bu endpointlerde
- index -> Giriş yapan, yapmayan herkes erişebilecek.
- dashboard -> Sadece giriş yapan ve rolü
user
veadmin
olan kullanıcılar erişebilecek. - admin -> Sadece giriş yapan ve rolü
admin
olan kullanıcılar erişebilecek.
@RestController
public class UserController {
@GetMapping("/admin")
public String admin(){
return "Admine özel mesajdır";
}
@GetMapping("/dashboard")
public String dashboard() {
return "Üyelere özel mesajdır";
}
@GetMapping("/index")
public String index(){
return "Merhaba. Üye Olun";
}
}
Code language: PHP (php)
Controllerimizi tamamladık.
Security configuration kısmına gelelim.
HttpSecurity
kısmında hasAnyRole
diyerek aynı url’e birden fazla rolde olan kullanıcının girebilmesi için rolleri yazabiliyoruz, eğer bir url’e sadece bir rol tanımlamak istersek hasRole
içerisine yazmamız yeterli olmaktadır.
Spring Security 5 ile birlikte password şifreleme varsayılan olarak desteklenmektedir. Kullanıcılarımızın şifreleri belirli bir algoritma ile encryptli ise bunu kolayca doğrulamak için şifre kısmının başına bu aşağıda yer alan anahtar kelimeleri yazmamız yeterli olmaktadır.
- {bcrypt} -> BCryptPasswordEncoder,
- {pbkdf2} -> Pbkdf2PasswordEncoder,
- {scrypt} -> SCryptPasswordEncoder,
- {sha256} -> StandardPasswordEncoder.
Eğer encrypt edilmemiş bir şifre tanımlamak istersek {noop}
yazmamız gerekmektedir aksi halde aşağıdaki hatayı alırız.
ava.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
Code language: CSS (css)
{noop}
yazmak yerine aşağıdaki kod bloğunu da ekleyebiliriz ancak deprecated olmuş bir yöntemdir.
@Bean
public PasswordEncoder getPasswordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
Code language: CSS (css)
In-Memory Auth kullanabilmek için AutehnticationManagerBuilder
kullanmaktayız. kullanıcı, şifre ve rol tanımlamalarını yapabiliyoruz
@EnableWebSecurity
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic();
http.formLogin();
http.authorizeHttpRequests()
.antMatchers("/dashboard").hasAnyRole("admin","user")
.antMatchers("/admin").hasRole("admin")
.and()
.authorizeHttpRequests()
.antMatchers("/index")
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin").password("{noop}1234").roles("admin")
.and()
.withUser("deneme").password("{noop}1234").roles("user");
}
}
Code language: PHP (php)
Projemizi çalıştırdıktan sonra ilgili sayfalara giriş yapabiliriz. Yetkisiz bir sayfaya erişmek istediğimizde aşağıdaki hataya benzer bir mesaj alırız.
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
There was an unexpected error (type=Unauthorized, status=401).
Unauthorized
Code language: JavaScript (javascript)
Bir sonraki yazıda görüşmek üzere.
No Comment! Be the first one.