在 Thymeleaf 中顯示登錄用戶的信息
一、概述
在這個快速教程中,我們將了解如何**在 Thymeleaf 中顯示登錄用戶的信息**。
我們將擴展我們在 Spring Security with Thymeleaf 文章中構建的項目。首先,我們將添加一個自定義模型來存儲用戶信息和檢索它們的服務。之後,我們將使用 Thymeleaf Extras 模塊中的 Spring Security Dialect 顯示它。
UserDetails
實現
UserDetails
是 Spring Security 的一個接口,用於保存與安全無關的用戶信息。
我們將創建UserDetails
接口的實現,其中包含一些自定義字段作為存儲經過身份驗證的用戶詳細信息的模型。但是,為了處理更少的字段和方法,我們將擴展默認的框架實現User
類:
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. UserDetailsService
實現
框架的UserDetailsService
單一方法接口負責在認證過程中獲取UserDetails
。
因此,為了能夠加載我們的CustomUserDetails,
我們需要實現UserDetailsService
ervice 接口。對於我們的示例,我們將硬編碼並將用戶詳細信息存儲在以用戶名作為鍵的Map
中:
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final PasswordEncoder passwordEncoder;
private final Map<String, CustomUserDetails> 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;
}
}
此外,為了實現所需的loadUserByUsername()
方法,我們通過用戶名從註冊表Map
中獲取相應的CustomUserDetails
對象。但是,用戶詳細信息將在生產環境中的存儲庫中存儲和檢索。
4. Spring 安全配置
首先,我們需要在 Spring Security 的配置中添加UserDetailsService
ervice,它將被連接到CustomUserDetailsService
實現。此外,我們將通過相應的方法將其設置在HttpSecurity
實例上。其餘的只是最低限度的安全配置,需要對用戶進行身份驗證並配置/login
、 /logout,
和/index
端點:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
private final UserDetailsService userDetailsService;
// omitting constructor
@Override
protected void configure(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");
}
}
5.顯示登錄用戶信息
Thymeleaf Extras 模塊提供對Authentication
對象的訪問權限,並且使用 Security Dialect,我們可以在 Thymeleaf 頁面上顯示登錄用戶信息。
CustomUserDetails
對象可通過Authentication
對象的principal
字段訪問。例如,我們可以使用sec:authentication=”principal.firstName”
訪問firstName
字段:
<!DOCTYPE html>
<html xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<title>Welcome to Spring Security Thymeleaf tutorial</title>
</head>
<body>
<h2>Welcome</h2>
<p>Spring Security Thymeleaf tutorial</p>
<div sec:authorize="hasRole('USER')">Text visible to user.</div>
<div sec:authorize="hasRole('ADMIN')">Text visible to admin.</div>
<div sec:authorize="isAuthenticated()">Text visible only to authenticated users.</div>
Authenticated username:
<div sec:authentication="name"></div>
Authenticated user's firstName:
<div sec:authentication="principal.firstName"></div>
Authenticated user's lastName:
<div sec:authentication="principal.lastName"></div>
Authenticated user's email:
<div sec:authentication="principal.lastName"></div>
Authenticated user roles:
<div sec:authentication="principal.authorities"></div>
</body>
</html>
或者,編寫沒有sec:authentication
屬性的安全方言表達式的等效語法是使用 Spring 表達式語言。因此,如果我們更喜歡它,我們可以使用 Spring 表達式語言格式顯示firstName
字段:
<div th:text="${#authentication.principal.firstName}"></div>
六,結論
在本文中,我們了解瞭如何在 Spring Boot 應用程序中使用 Spring Security 的支持在 Thymeleaf 中顯示登錄用戶的信息。
與往常一樣,示例的源代碼可在 GitHub 上獲得。