Tản mạn về Spring security

Chào các bạn..!

Ở bài Làm chủ spring boot bằng cách tạo cách tạo crud trong 30 phút  mình đã giới thiệu đến các bạn cách tạo 1 rest API bằng Spring boot  ở bài hôm nay mình sẽ tích hợp Authentication cho em nó bằng spring security.

Trước hết chúng ta sẽ tìm hiểu khái niệm về Spring security chút nhé

Spring security: nó là một framework hay đúng hơn là một công cụ cung cấp và xử lý các vấn đề về xác thực và phân quyền cho các ứng dụng web nó là một công cụ luôn song hành và luôn được ưu tiên sử dụng trong các dự án về java trong đó nổi bật nhất là  spring boot. ok hiểu nôm na là như vậy

Cơ chế : 

 

Spring security cung cấp cho ta 2 cơ chế cơ bản

  • Authentication: cơ chế xác thực xem bạn có được quyền vào ứng dụng của bạn không túm váy như kiểu đăng nhập bằng username và password đúng hay sai vậy đây là ải đầu tiên của spring security.
  • Authorization: cung cấp cho chúng ta cơ chế phân quyền xem user này có được thao tác hành động nào đó không, đơn giản nhất là admin có quyền thêm xóa thành viên có quyền xem bài vậy tất nhiên tới ải này được thì chúng ta phải vượt qua được ải thứ nhất.

Xàm lý thuyết vậy đủ rồi giờ mình sẽ vào thực hành cho các bạn hiểu luôn mình sẽ tích hợp luôn authentication vào source của bài  https://devtayto.com/lam-chu-spring-boot-bang-cach-tao-cach-tao-crud-trong-30-phut/  nên các bạn đọc qua bài đó trước khi đọc bài này nhé, ok bắt đầu nào.

Đầu tiên mình sẽ  thêm những  dependency  cần thiết dưới đây vào vào file pom.xml  

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>

<!– https://mvnrepository.com/artifact/com.auth0/auth0 –>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>auth0</artifactId>
<version>1.5.0</version>
</dependency>

<!– https://mvnrepository.com/artifact/com.auth0/auth0-spring-security-api –>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>auth0-spring-security-api</artifactId>
<version>1.0.0</version>
</dependency>

  •  Đầu tiên để bắt add authentication vào source ta cần tạo một đối tượng user để chứa thông tin của các user login ở đây mình tạo 1 cái đơn giản chỉ gồm username và password

  • Tiếp tới ta tạo 1 class UsersDto.java 

  • Tiếp tới mình tạo thêm 1 class UserRepository.java để lấy thông tin User từ database phục vụ cho việc authentication.
  • Tiếp theo chúng ta tạo thêm 1 package security như hình vì để cho các bạn dễ theo dõi cũng như dễ hiểu mình sẽ để tất cả các class liên quan tới authentication trong package khi code được rồi thì các bạn tự tách ra cho đúng với cấu trúc source nhé.

  • Đầu tiên ta sẽ tạo 1 file TokenAuthenticationService.java để xử lý nhiệm vụ generate ra jwt (json web token)

 

  • Ở đây vì mình sẽ lấy thông tin user từ database để authentication nên mình phải có 1 service để tìm user được nhập vào khi authentication xem nó có trong database không vì thế ở đây mình sẽ tạo tiếp 1 class UserService.java và implements lại UserDetailsService.java  mà spring cung cấp để có thể so sánh được thông tin của user trong database và thông tin user được nhập vào
  • Khi authentication chúng ta cần nhập vào username và password để authentication chính vì vậy chúng ta cần tạo 1 class để hứng thông tin nhập vào và tiến hành trả lại token ra cho người dùng nếu thành công vì thế mình sẽ tạo thêm 1 class LoginFilter.java kế thừa lại AbstractAuthenticationProcessingFilter.java của spring nhằm mục đích custom lại 2 hàm attemptAuthentication  có nhiệm vụ authen và successfulAuthentication có nhiệm vụ xử lý trả ra token cho người dùng nếu authen thành công.

Như chúng ta đã biết khi authen thành công thì chúng ta sẽ dùng token để có thể truy cập các API khác đúng không nào ủa vậy thì class xử lý token đó xem có đúng hay là sai để còn cho vào hoặc đuổi ra đâu rồi. ?? vì vậy chúng ta cần phải tạo ra 1 file filter để hứng tất cả các request trước khi cho nó có quyền vào bất kì 1 API nào được chỉ định là phải có token mới được vào.

Ở đây mình sẽ tạo thêm 1 class để hứng các request đó  và đặt tên là AuthenticationFilter.java

Vậy là tạm xong giờ chúng ta chỉ cần tạo thêm 1 class để config xem API nào sẽ bị chặn và API nào sẽ được truy cập mà không cần qua class authen ở trên nên  mình sẽ tạo thêm 1 class WebSecurityConfig.java  ở đây mình sẽ mở API có đường dẫn /authen sẽ không cần token để truy cập vì trang authen là để get ra token thì có token mới cho truy cập thì bằng hòa à đúng không nào :))

ở đây mình sẽ Override 2 method configure với configure đầu dùng để lọc API và configure 2 dùng để chỉ định sẽ lấy user trong DB để authen

Ok vậy là xong chạy thử chương trình lên ta được như hình

ở đây mình đang để port là 6913 lên ta sẽ mở postman test thử API vừa tạo

ồ wtf mình chưa tạo API để add user vào thì lấy gì authentication đây???  đành mở xampp bật localhost và MySQL nên để add thử 1 user vào sau đó tiến hành authen vì mình lười code API add user quá đi :))

truy cập vào http://localhost/phpmyadmin/ ở đây trong application.xml mình đang sử dụng DB test ok vào sửa thôi. ở đây mình sẽ add username = devtayto và pass: 123

 

ok xong trở lại postman authen thử ở phía code mình đã xử lý bắt được cả body json và value nên các bạn nhập input kiểu nào cũng được ở đây mình dùng json cho nó máu

Kết  quả ta được

đã lấy được token giờ ta thử dùng để truy cập các API khác nhé các bạn thêm Bearer ở đầu cách ra xong điền token như hình để authen nhé vì token mình set có 2 phút thôi nên các bạn có thể set dài hơn ở class TokenAuthenticationService.java

Được như hình trên là thành công vì chưa có data trong DB nên các bạn tự add thông tin sinh viên vào mà get lại nhé chỉ như thế thôi mục đích bài này chỉ để cho các bạn hiểu sơ bộ về spring security còn 1 phần mã hóa password mình để lại cho các bạn coi như là một bài tập nhỏ các bạn có thể sử dùng bất kì trình mã hóa nào mà mình thích (MD5, BCrypt) hoặc tự code cơ chế mã hóa riêng cho mình nhé.

Chúc các bạn thành công.!

Download source code