Written By: Lê Anh Tuấn (Java 10)
Gmail: anhtuan097856@gmail.com
Bài viết gốc: https://www.javadevjournal.com/spring-security/spring-security-with-thymeleaf/

Tổng quan

Trong bài viết này, mình sẽ nói về Spring Security với Thymeleaf. Chúng ta sẽ kiểm tra các thẻ Spring security khác nhau có sẵn với Thymeleaf và cách chúng ta có thể sử dụng các thẻ khác nhau trong khi xây dựng ứng dụng web của mình.

1. Dependencies

Để sử dụng phương ngữ Thymeleaf với Spring security trong ứng dụng web của bạn, chúng ta cần bao gồm Spring security với mô-đun Thymeleaf trong ứng dụng của mình. Đây là cách pom.xml của chúng ta sẽ trông như thế này

<dependency>
   <groupId>org.thymeleaf.extras</groupId>
   <artifactId>thymeleaf-extras-springsecurity5</artifactId>
   <version>3.0.4.RELEASE</version>
</dependency>

Đảm bảo rằng bạn đang bao gồm phiên bản mới nhất trong tệp pom.xml. Sau khi thiết lập xong ứng dụng, hãy xem cách sử dụng các tùy chọn khác nhau với Spring security.

2. Phương thức bảo mật

Phương thức Spring security cho phép hiển thị nội dung hoặc liên kết có điều kiện dựa trên vai trò của người dùng. Thẻ cốt lõi có sẵn với Spring security Thymeleaf là thẻ <sec:authorize*>. Hãy coi thẻ này như một thẻ if có sẵn trong thư viện thẻ JSTL. Thẻ <sec:authorize*> có thể có biểu thức và sẽ hiển thị nội dung trang có điều kiện.

3. Thẻ sec:Authorization

Thẻ <sec:authorize*> sẽ giúp chúng ta hiển thị có điều kiện thông tin nhất định trên các trang web. Chúng ta có thể sử dụng biểu thức SpEL để kiểm soát tốt các quy tắc. Hãy lấy một vài ví dụ để hiểu nó dễ dàng hơn.

  1. Trong trường hợp chúng ta muốn hiển thị nội dung nhất định cho người dùng có vai trò là “USER”, chúng ta có thể dễ dàng thực hiện điều đó với sự trợ giúp của hasRole() -<div sec:authorize ="hasRole('USER')">. Phần này sẽ chỉ hiển thị nếu người dùng hiện tại có vai trò USER
  2. <div sec:authorize ="isAuthenticated()"> sẽ hoạt động cho tất cả người dùng đã xác thực. Hãy nhớ rằng, nếu bạn không được xác thực, nội dung div sẽ không hiển thị.

4. Thẻ sec:authentication

Trong khi làm việc trên thẻ Spring security, bạn có thể cần thông tin về mã chính được xác thực hoặc yêu cầu xác thực. Giao diện Spring security authentication cung cấp quyền truy cập vào các chi tiết này và chúng tôi có thể truy cập chúng trong thẻ Spring security bằng cách sử dụng thẻ <sec:authentication>. Dưới đây là một số trường hợp sử dụng phổ biến cho thẻ <sec:authentication>.

  1. Hiển thị tên của người dùng đã đăng nhập - <div sec:authentication="name">
  2. Hiển thị quyền hạn / vai trò truy cập cho người dùng đã xác thực - <div sec:authentication="principal.authorities">
  3. Chúng ta cũng có thể sử dụng sec :hentication = "prop" để xuất ra thuộc tính prop của đối tượng xác thực.

5. Quy tắc truy cập URL

Thư viện thẻ Spring security cũng cung cấp khả năng kiểm soát nội dung dựa trên các quy tắc ủy quyền URL hiện có được xác định trong tệp cấu hình bảo mật của chúng ta. Chúng ta có thể làm điều này bằng cách sử dụng các phương thức AuthozeRequests()antMatchers(). Hãy lấy một ví dụ, trong đó chúng ta muốn đảm bảo rằng tất cả liên kết với / admin chỉ được hiển thị cho người dùng Admin. Chúng ta có thể làm điều này bằng 2 cách.

  1. Chúng ta có thể sử dụng sec:Authorization như được mô tả trong phần 3
  2. Xác định quy tắc trong tệp cấu hình Spring security và sử dụng thẻ <sec:authorize-url>.

Đây là cách chúng tôi sẽ xác định quy tắc trong tệp cấu hình Spring security:

@Override
protected void configure(HttpSecurity http) throws Exception {
     http.authorizeRequests()
         ...
         .antMatchers("/admin/**").hasAuthority("ADMIN")
         ..
}

Trên frontend, chúng tôi có thể sử dụng thẻ <sec:authorize-url> để hiển thị nội dung chỉ trong trường hợp người dùng có role ADMIN.

<li sec:authorize-url="/admin/">
   <a id="admin" th:href="@{/admin/manage}">Admin</a>
</li>

Bạn thậm chí có thể mở rộng điều này để thêm phương thức HTTP như một điều kiện bổ sung

<li sec:authorize-url="GET /admin/">
   <a id="admin" th:href="@{/admin/manage}">Admin</a>
</li>

Sử dụng thẻ <sec:authorize-url> cung cấp khả năng chuyển kiểm tra xác thực từ UI sang tệp cấu hình Spring security, điều này có thể giúp loại bỏ kiểm tra cụ thể khỏi các trang (hãy nhớ bạn cần đặt hasRole("ADMIN")). Lưu ý rằng phương thức HTTP phải khớp với trường hợp được chỉ định trong phương thức bảo mật antMatchers() của bạn, nếu không chúng có thể không khớp như bạn mong đợi.

6. Đối tượng Tiện ích Biểu thức

Spring Security với Thymeleaf cũng cung cấp đối tượng #authentication mà chúng ta có thể sử dụng để xây dựng logic có điều kiện. Điều này tương tự như thẻ sec:authentication Hãy xem một vài ví dụ trong thực tế.

<div th:text="${#authentication.name}">
</div>

Chúng ta cũng có thể sử dụng đối tượng #authentication để xây dựng logic bằng cách sử dụng điều kiện if

<div th:if="${#authorization.expression('hasRole(''ROLE_ADMIN'')')}">
 ADMIn section
</div>

7. Ứng dụng thử nghiệm

Tải xuống ứng dụng bảo mật Spring từ GitHub và chạy ứng dụng. Khi ứng dụng đã khởi động và đang chạy, hãy đăng nhập vào ứng dụng. Khi bạn đã ở trong phần tài khoản, hãy kiểm tra bảng điều khiển trên cùng bên phải, bạn sẽ thấy tên của mình với tùy chọn đăng xuất. Để hiển thị tên người dùng đã đăng nhập, chúng tôi đang sử dụng thư viện thẻ thymeleaf bảo mật Spring.

example

Đây là code có thẻ Spring security thymeleaf :

<a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
  <span class="hidden-xs" sec:authentication="name"></span>
</a>

Link tham khảo: Github Repo

Thanks for watching!