Spring Security ~ GrantedAuthority

Wadcharapong Naklam
2 min readJul 22, 2024

--

Photo by Alexander Mils on Unsplash

มาถึงบทความที่ 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 ที่เราต้องการ สามารถนำไปประยุกต์ใช้ตามความเหมาะสมของแต่ละโปรเจคกันได้เลยครับ

--

--