Security phần 4 - Phân quyền

Phần 2 ta đã có thể quy định một router /api/books bắt buộc phải truy cập được nhưng làm thế nào để cùng một router đó:

Đầu tiên, ta tạo class MethodSecurityConfig trong package configurations với nội dung

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.method.configuration.GlobalMethodSecurityConfiguration;

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
}

Sau đó, quy định thao tác DELETE yêu cầu quyền ROLE_ADMIN mới được truy cập bằng cách thêm annontation @Secured("ROLE_ADMIN")

    @Secured("ROLE_ADMIN")
    @DeleteMapping("/{id}")
    void delete(@PathVariable int id){

        if(!bookRepository.existsById(id)){
            throw new NotFoundException(String.format("Book id %d not found", id));
        }

        bookRepository.deleteById(id);
    }

Kết quả

Thực hiện login với 2 account useradmin, dùng jwt token để gửi request DELETE lên /api/books/2.

Với token của account user, ta nhận được error 403

Security

Với token của account admin, ta nhận được error 401 vì sách không tồn tại (việc truy cập là được phép)

Security

Ta cũng có thể áp dụng @Secured("ROLE_ADMIN") vào một controller, khi đó, mọi action thuộc controller đó đều bị ảnh hưởng bởi cờ này.


@RestController
@RequestMapping("/api/books")
@Secured("ROLE_ADMIN")
public class BookController {
    
    ......

}

Tham khảo thêm - https://www.baeldung.com/spring-security-method-security - https://docs.spring.io/spring-security/site/docs/4.2.12.BUILD-SNAPSHOT/apidocs/org/springframework/security/access/annotation/Secured.html

Xem:

Trang chủ