Trong hướng dẫn nhanh này, chúng ta sẽ xem cách chúng ta có thể hiển thị thông tin người dùng đã đăng nhập trong Thymeleaf
Chúng tôi sẽ mở rộng dự án mà chúng tôi đã xây dựng trong bài viết Spring Security with Thymeleaf. Đầu tiên, chúng tôi sẽ thêm một mô hình tùy chỉnh để lưu trữ thông tin người dùng và dịch vụ để truy xuất chúng. Sau đó, chúng tôi sẽ hiển thị nó bằng Phương ngữ bảo mật mùa xuân từ mô-đun Thymeleaf Extras
2. Triển khai chi tiết người dùng
UserDetails là một giao diện từ Spring Security được sử dụng để chứa thông tin người dùng không liên quan đến bảo mật
Chúng tôi sẽ tạo triển khai giao diện UserDetails với một số trường tùy chỉnh làm mô hình để lưu trữ chi tiết người dùng đã xác thực của chúng tôi. Tuy nhiên, để xử lý ít trường và phương thức hơn, chúng tôi sẽ mở rộng triển khai khung mặc định, lớp Người dùng
public class CustomUserDetails extends User {
private final String firstName;
private final String lastName;
private final String email;
private CustomUserDetails[Builder builder] {
super[builder.username, builder.password, builder.authorities];
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.email = builder.email;
}
// omitting getters and static Builder class
}
3. Chi tiết người dùng Triển khai dịch vụ
Giao diện phương thức đơn UserDetailsService của khung chịu trách nhiệm tìm nạp UserDetails trong quá trình xác thực
Do đó, để có thể tải CustomUserDetails của chúng tôi, chúng tôi sẽ cần triển khai giao diện UserDetailsService. Ví dụ của chúng tôi, chúng tôi sẽ mã hóa cứng và lưu trữ chi tiết người dùng trong Bản đồ có tên người dùng làm khóa
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final PasswordEncoder passwordEncoder;
private final Map userRegistry = new HashMap[];
// omitting constructor
@PostConstruct
public void init[] {
userRegistry.put["user", new CustomUserDetails.Builder[].withFirstName["Mark"]
.withLastName["Johnson"]
.withEmail["[email protected]"]
.withUsername["user"]
.withPassword[passwordEncoder.encode["password"]]
.withAuthorities[Collections.singletonList[new SimpleGrantedAuthority["ROLE_USER"]]]
.build[]];
userRegistry.put["admin", new CustomUserDetails.Builder[].withFirstName["James"]
.withLastName["Davis"]
.withEmail["[email protected]"]
.withUsername["admin"]
.withPassword[passwordEncoder.encode["password"]]
.withAuthorities[Collections.singletonList[new SimpleGrantedAuthority["ROLE_ADMIN"]]]
.build[]];
}
@Override
public UserDetails loadUserByUsername[String username] throws UsernameNotFoundException {
CustomUserDetails userDetails = userRegistry.get[username];
if [userDetails == null] {
throw new UsernameNotFoundException[username];
}
return userDetails;
}
}
Ngoài ra, để triển khai phương thức loadUserByUsername[] bắt buộc, chúng tôi đang tìm nạp đối tượng CustomUserDetails tương ứng từ Bản đồ đăng ký theo tên người dùng. Tuy nhiên, thông tin chi tiết về người dùng sẽ được lưu trữ và truy xuất từ kho lưu trữ trong môi trường sản xuất
4. Cấu hình bảo mật mùa xuân
Đầu tiên, chúng ta cần thêm UserDetailsService trong cấu hình của Spring Security, cấu hình này sẽ được kết nối với triển khai CustomUserDetailsService. Hơn nữa, chúng ta sẽ đặt nó trên phiên bản HttpSecurity thông qua phương thức tương ứng. Phần còn lại chỉ là cấu hình bảo mật tối thiểu yêu cầu người dùng phải được xác thực và định cấu hình các điểm cuối/đăng nhập,/đăng xuất và/chỉ mục
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
private final UserDetailsService userDetailsService;
// omitting constructor
@Bean
public SecurityFilterChain filterChain[HttpSecurity http] throws Exception {
http.userDetailsService[userDetailsService]
.authorizeRequests[]
.anyRequest[]
.authenticated[]
.and[]
.formLogin[]
.loginPage["/login"]
.permitAll[]
.successForwardUrl["/index"]
.and[]
.logout[]
.permitAll[]
.logoutRequestMatcher[new AntPathRequestMatcher["/logout"]]
.logoutSuccessUrl["/login"];
return http.build[];
}
}
5. Hiển thị thông tin người dùng đã đăng nhập
Mô-đun Thymeleaf Extras cấp quyền truy cập vào đối tượng Xác thực và với Phương ngữ bảo mật, chúng tôi có thể hiển thị thông tin người dùng đã đăng nhập trên các trang Thymelef
Đối tượng CustomUserDetails có thể truy cập thông qua trường chính trên đối tượng Xác thực. Chẳng hạn, chúng ta có thể truy cập trường FirstName bằng giây. xác thực =”chính. họ"
Welcome to Spring Security Thymeleaf tutorial
Welcome
Spring Security Thymeleaf tutorial
Text visible to user.
Text visible to admin.
Text visible only to authenticated users.
Authenticated username:
Authenticated user's firstName:
Authenticated user's lastName:
Authenticated user's email:
Authenticated user roles:
Ngoài ra, một cú pháp tương đương để viết các biểu thức Phương ngữ bảo mật mà không cần giây. thuộc tính xác thực đang sử dụng Ngôn ngữ biểu thức mùa xuân. Do đó, chúng tôi có thể hiển thị trường FirstName bằng định dạng Ngôn ngữ biểu thức Spring nếu chúng tôi cảm thấy thoải mái hơn với nó
6. Sự kết luận
Trong bài viết này, chúng ta đã thấy cách chúng ta có thể hiển thị thông tin người dùng đã đăng nhập trong Thymeleaf bằng cách sử dụng sự hỗ trợ của Spring Security trong ứng dụng Spring Boot