Spring Security的permitAll不生效问题:未登录用户访问非ADMIN路径返回Unauthorized错误
解决Spring Security权限配置问题
我看了你的配置思路是对的,但目前的设置没法满足“未登录用户访问任何路径都返回Unauthorized”的需求——问题出在anyRequest().permitAll()这一行,它会让所有非/admin路径对包括未登录用户在内的所有人开放,这和你想要的效果不符。
修正后的配置代码
@Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .httpBasic() // 使用HTTP Basic认证方式 .and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 启用无状态会话 .and() .headers().frameOptions().disable() .and() .authorizeRequests() .antMatchers("/**/admin/**").hasRole(Role.ADMIN.getAuthority()) // 仅管理员角色可访问admin相关路径 .anyRequest().authenticated(); // 其余所有路径需已认证(登录)才能访问 }
关键修改说明
- 把
anyRequest().permitAll()替换成anyRequest().authenticated():这会要求所有非admin路径的访问者必须是已登录(认证通过)的用户,未登录的请求会直接返回"error": "Unauthorized"错误,正好匹配你的需求。 - 关于
hasRole的细节提醒:Spring Security的hasRole方法会自动给角色名加上ROLE_前缀。如果你的Role.ADMIN.getAuthority()返回的是ADMIN,那hasRole("ADMIN")实际检查的是ROLE_ADMIN权限;如果你的枚举返回的就是ROLE_ADMIN,那这个写法没问题。如果不想自动加前缀,你可以改用hasAuthority(Role.ADMIN.getAuthority()),这样会直接匹配你定义的权限字符串。
调整后就能实现:
- 所有
/**/admin/**路径:只有拥有管理员角色的登录用户才能访问 - 其他所有路径:只要是登录用户就能访问,未登录用户访问会返回Unauthorized错误
内容的提问来源于stack exchange,提问作者user16613329
相关产品推荐
相关产品推荐

