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
相关产品推荐
相关产品推荐

