Spring Security ~ GrantedAuthority
มาถึงบทความที่ 3 ของ Spring Security ใครที่ยังไม่ได้อ่าน 2 บทความก่อนหน้าแนะนำให้อ่านก่อนนะครับ เนื่องจาก code จะใช้ต่อเนื่องกัน สามารถอ่านได้ที่
บทความนี้เราจะมาพูดถึงการใช้งาน GrantedAuthority เพื่อกำหนดสิทธิ์ให้ API ที่เราต้องการจะให้เข้าถึงได้เฉพาะกลุ่มโดยจะดูจาก Roles ของ Principal นั่นเอง
เริ่มจากเราจะต้องเป็นการใช้งาน Spring Security Method Security วิธีการนั้นแสนง่ายเพียงแค่เพิ่ม code ที่ SecurityConfig.java
@EnableMethodSecurity(
securedEnabled = true
)
package com.example.demofilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
@EnableMethodSecurity(
securedEnabled = true
)
@Configuration
public class SecurityConfig {
final JwtService jwtService;
public SecurityConfig(JwtService jwtService) {
this.jwtService = jwtService;
}
@Bean
public SecurityFilterChain filterChain1(HttpSecurity http) throws Exception {
JwtAuthorizationFilter jwtAuthorizationFilter = new JwtAuthorizationFilter(jwtService);
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers(
"/public/**"
)
.permitAll()
.anyRequest()
.authenticated()
)
.addFilterAfter(jwtAuthorizationFilter, UsernamePasswordAuthenticationFilter.class)
;
return http.build();
}
}
เสร็จแล้วเราจะไปเพิ่ม API endpoint สำหรับ create token ที่ roles ต่างกันดังนี้
- endpoint -> /public/token/user สำหรับ Role User
- endpoint -> /public/token/admin สำหรับ Role Admin
- endpoint -> /public/token/both สำหรับ Role User และ Admin
package com.example.demofilter;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/public")
@RequiredArgsConstructor
public class PublicController {
final JwtService jwtService;
@GetMapping
public String hello() {
return "Hello World";
}
@GetMapping("/token/user")
public String getTokenUser() {
UserProfile userProfile = new UserProfile(1L, "menkung@email.test.x", "Menkung", "Iris", List.of("USER"));
return jwtService.createJwt(userProfile, 60);
}
@GetMapping("/token/admin")
public String getTokenAdmin() {
UserProfile admin = new UserProfile(2L, "admin@email.test.x", "Admin", "Iris", List.of("ADMIN"));
return jwtService.createJwt(admin, 60);
}
@GetMapping("/token/both")
public String getTokenBoth() {
UserProfile admin = new UserProfile(3L, "super@email.test.x", "Super", "Iris", List.of("ADMIN","USER"));
return jwtService.createJwt(admin, 60);
}
}
จากนั้น เราจะทำการกำหนดสิทธิ์เข้าถึงที่ private API ตาม roles ดังนี้
@Secured({"ชื่อของRole 1", "ชื่อของRole 2"})
- endpoint -> /private/user สำหรับใครที่มี role User
- endpoint -> /private/admin สำหรับใครที่มี role Admin
package com.example.demofilter;
import org.springframework.security.access.annotation.Secured;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/private")
public class PrivateController {
@GetMapping("/user")
@Secured({"USER"})
public String helloUser() {
return "Hello World private !!!!!";
}
@GetMapping("/admin")
@Secured({"ADMIN"})
public String helloAdmin() {
return "Hello World private admin !!!!!";
}
}
เสร็จแล้วก็ทำการ run โปรเจคขึ้นมาแล้วทำการทดสอบกันเลย
curl 'localhost:8080/public/token/user'
เพื่อขอ Token user
curl 'localhost:8080/private/user' \
--header 'Authorization: Bearer {youToken}' \
จะได้ response -> Hello World private !!!!!
curl 'localhost:8080/private/admin' \
--header 'Authorization: Bearer {youToken}' \
จะได้ response -> http status code 403
---------------------------------------------
curl 'localhost:8080/public/token/admin'
เพื่อขอ Token admin
curl 'localhost:8080/private/user' \
--header 'Authorization: Bearer {youToken}' \
จะได้ response -> http status code 403
curl 'localhost:8080/private/admin' \
--header 'Authorization: Bearer {youToken}' \
จะได้ response -> Hello World private admin !!!!!
---------------------------------------------
curl 'localhost:8080/public/token/both'
เพื่อขอ Token User, Admin
curl 'localhost:8080/private/user' \
--header 'Authorization: Bearer {youToken}' \
จะได้ response -> Hello World private !!!!!
curl 'localhost:8080/private/admin' \
--header 'Authorization: Bearer {youToken}' \
จะได้ response -> Hello World private admin !!!!!
เพียงเท่านี้ก็เป็นอันเสร็จแล้วครับกับการกำหนดสิทธิ์เข้าถึง endpoint ที่เราต้องการ สามารถนำไปประยุกต์ใช้ตามความเหมาะสมของแต่ละโปรเจคกันได้เลยครับ
Source code : https://github.com/wadcharapong-n/demofilter