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

Spring Security中hasRole失效且@AuthenticationPrincipal为null问题排查

问题根因

该问题核心是测试代码配置错误,同时存在一处实体类笔误,安全配置本身的权限拦截逻辑没有问题。


具体问题点及修复方案

  • 1. MockMvc未加载Spring Security过滤器链

    你初始化MockMvc时仅传入了Web应用上下文,没有启用Spring Security的过滤器配置,导致你编写的LibrarySecurityConfiguration权限规则完全没有在单元测试中生效,既不会做角色校验,也不会把认证用户信息注入到请求上下文,所以才会出现无权限用户可以正常访问接口、@AuthenticationPrincipal和HttpServletRequest.getRemoteUser()返回null的情况。
    修复方法是在MockMvc初始化时添加Security配置:
    // 需先导入org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity
    @BeforeEach
    public void setup() {
        mockMvc = MockMvcBuilders
            .webAppContextSetup(context)
            // 新增该行加载Spring Security过滤器链
            .apply(springSecurity())
            .build();
        gilbert = (LibraryUser)uds.loadUserByUsername("gilbert");
    }
    
  • 2. LibraryUser实体类属性名笔误

    你的实体类中定义的管理员标识属性为private boolean library = false;,但权限生成方法中判断的是if(librarian),属性名不匹配会导致即使用户是管理员,也无法正确获得ROLE_LIBRARIAN权限。
    修复方法为对齐属性名:
    // 修正属性名
    private boolean librarian = false;
    
  • 补充:若实际需求是限制ROLE_BUYER角色访问

    你问题开头提到需求是限制拥有ROLE_BUYER角色的用户才可访问,而当前安全配置中PUT接口要求的是hasRole("LIBRARIAN"),如果是需求不符,修改安全配置中的角色名即可。

内容的提问来源于stack exchange,提问作者Nice Books

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:33:01