- vừa được xem lúc

(Phần 2) Spring boot 3.0 và Spring Security 6.0

0 0 11

Người đăng: Hách

Theo Viblo Asia

Trong phần 1 của series https://viblo.asia/p/phan-1-spring-boot-30-va-spring-security-60-GAWVpdBYV05 chúng ta đã hoàn thành bước config cho ứng dụng. Ở bài viết này, chúng ta sẽ tiến hành phân quyền user cho website.(Bài viết này khá ngắn, tuy nhiên mọi ngưòi nên đọc kỹ để hiểu được lý do tại sao lại config như vậy, vì có thể viết nhầm làm chương trình không chạy được mà không biết lý do)

Ở bài viết trước cho dù đăng nhập với tài khoản ADMIN hoặc USER thì đều có thể xem được tất cả các api yêu cầu xác thực. Tuy nhiên trong bài toán thực tế, chúng ta sẽ cần kiểm tra quyền của user để xử lý một số nghiệp vụ nhất định, ví dụ như thêm sửa xóa các user trong hệ thống.

1. Đặt ra vấn đề

Quay trở lại với Project của bài trước

Ở đây chúng ta có 3 endpoints, với endpoint "customer/all" chỉ tài khoản có quyền ADMIN mới xem được, với endpoint "customer/{id}" chỉ tài khoản có quyền USER mới xem được.

2. Cách xử lý

Để có thể phân quyền trong project, Spring boot cung cấp cho chúng ta một annotation có tên là @PreAuthorize. Để có thể sử dụng, trước tiên chúng ta cần khai báo annotation @EnableMethodSecurity(có nhiệm vụ Enables Spring Security Method Security, mọi ngưòi có thể xem definition của annotation để hiểu rõ hơn) vào bất kỳ file nào có annotation @Configuration, ở trong project này là SecurityConfig,

Mình sẽ để link definition của @PreAuthorize ở đây để m.n có thể tìm hiểu thêm: https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/access/prepost/PreAuthorize.html, https://www.appsdeveloperblog.com/spring-security-preauthorize-annotation-example/

Với cách này, chúng ta chỉ cần thêm annotation vào mỗi Request Mapping và define role được quyền truy cập vào api

Lưu ý: Ở trong SecurityConfig có khai báo Bean userDetailsService như dưói đây:

@Bean public UserDetailsService userDetailsService(PasswordEncoder encoder) { UserDetails admin = User.withUsername("hach") .password(encoder.encode("hacheery")) .roles("ADMIN") .build(); UserDetails user = User.withUsername("user") .password(encoder.encode("pwd1")) .roles("USER") .build(); return new InMemoryUserDetailsManager(admin, user); }

Khi trỏ vào roles("ADMIN") mọi ngưòi sẽ thấy đoạn code define của roles như hình dưói

Ở dòng 416, khi chúng ta define role ADMIN, Springboot sẽ tự động thêm prefix "ROLE_" nên role ADMIN sẽ trở thành ROLE_ADMIN. Cho nên chúng ta cần khai báo @PreAuthorize("hasAuthority('ROLE_ADMIN')") thay vì @PreAuthorize("hasAuthority('ADMIN')")

Link source code: https://github.com/hachnv8/spring-security

Ở bài viết này, chúng ta đã cùng nhau phân quyền cho các endpoints. Trong bài viết tiếp theo, thay vì hard code user detail, chúng ta sẽ thực hiện các bước để lưu cũng như lấy dữ liệu user detail từ database. Nếu có vấn đề gì thắc mắc mọi người có thể cmt ở dưới ạ 😄

Bình luận

Bài viết tương tự

- vừa được xem lúc

Java Spring - Tổng hợp các chủ đề từ cơ bản đến nâng cao

Trong bài viết này mình xin được tổng hợp một số chủ đề từ cơ bản đến nâng cao khi lập trình web với Java. Bên cạnh các kiến thức căn bản như làm thế nào để tạo mới project từ https://start.

0 0 48

- vừa được xem lúc

[JAVA] (Overview) Phần 1 - Spring vs. Spring Boot vs. Spring MVC

Tổng quan. Spring Framework từ lâu đã không còn xa lạ gì đối với lập trình viên Java nói chung và Java Web nói riêng, nó cung cấp rất nhiều tính năng giúp xây dựng sản phẩm một cách thuận tiện và nhan

0 0 35

- vừa được xem lúc

Spring Boot - Firebase push notification

1. Tạo tài khoản trên FCM console.

0 0 23

- vừa được xem lúc

Hikari: Connection is not available, request timeout after 30000ms

Ngày xửa ngày xưa... mà cũng không xưa lắm, câu chuyện xảy ra mới cách đây vài năm trước... Nhưng đừng lo, nếu chuyện đó xảy ra thì hi vọng Google đã kịp index bài viết của mình để các bạn search ra v

0 0 17

- vừa được xem lúc

Spring boot 3.0 và Spring security 6.0

Như mọi người đã biết thì Spring Boot đã ra mắt phiên bản thứ 3 vào cuối tháng 11(24/11/2022) mang theo khá nhiều sự thay đổi, một trong số đó là Spring Security. Nếu như ở phiên bản Spring Security 5

0 0 23

- vừa được xem lúc

Tạo một project đơn giản với Spring Boot và PWA(Progressive Web Apps) kết hợp Lighthouse extension

Trong bài viết này, tôi sẽ hướng dẫn các bạn làm thế nào để cài đặt PWA cũng như Service Worker, tôi chia làm các phần như bên dưới:. .

0 0 20