如何在Spring Security中使用@AuthenticationPrincipal获取Principal
使用@AuthenticationPrincipal获取用户主体的控制器修改方案
问题背景
我正在开发一个Spring Security项目,要求使用@AuthenticationPrincipal注解获取Principal,现有控制器代码如下,需要如何修改以引入该注解?
原控制器代码:
@Controller public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } @GetMapping("/user") public String showUser(Model model) { User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); model.addAttribute("user", user); return "users"; } }
修改方案
- 导入
@AuthenticationPrincipal注解:需要导入org.springframework.security.core.annotation.AuthenticationPrincipal包 - 在方法参数中直接注入用户主体:将
User对象通过@AuthenticationPrincipal注解直接注入到方法参数中,替代原来通过SecurityContextHolder手动获取的逻辑
修改后的完整代码:
import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class UserController { private final UserService userService; public UserController(UserService userService) { this.userService = userService; } @GetMapping("/user") public String showUser(Model model, @AuthenticationPrincipal User user) { model.addAttribute("user", user); return "users"; } }
补充说明
@AuthenticationPrincipal会自动从当前SecurityContext中提取认证后的用户主体,无需手动调用SecurityContextHolder- 确保你的
User类实现了Spring Security的UserDetails接口(或是自定义认证主体类,且Spring Security能正确识别并注入)
内容的提问来源于stack exchange,提问作者Kristina
相关产品推荐
相关产品推荐

