You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:45:34