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

Spring Security XML配置开放单个URL权限失败求助

问题根源分析

你遇到的问题核心在于:你只给/status路径设置了security="none",但控制器会将请求重定向到/pages/status.html,而这个重定向后的路径并没有被排除在Spring Security的校验之外。

当用户访问/status时,虽然这个路径被跳过了安全校验,但控制器会返回重定向指令,让浏览器发起一个新的请求/pages/status.html。这个新请求会匹配到你后面定义的<security:http pattern="/**">规则,而这个规则下所有路径都要求authenticated,最后还设置了denyAll,所以自然会抛出AuthenticationCredentialsNotFoundException。

解决方案

你可以通过以下两种方式解决这个问题:

方式一:排除重定向后的路径

修改你的Spring Security配置,把重定向目标路径也加入到security="none"的规则中:

<!-- 排除/status以及重定向后的/pages/status.html -->
<security:http pattern="/status" security="none"/>
<security:http pattern="/pages/status.html" security="none"/>

<!-- 你的全局安全配置 -->
<security:http create-session="stateless" use-expressions="true" authentication-manager-ref="authenticationManager" auto-config="true" entry-point-ref="http403EntryPoint" pattern="/**">
    <!-- 原有规则保持不变 -->
</security:http>

如果页面还有依赖的静态资源(比如CSS、JS文件),也需要一并排除,避免被安全规则拦截。

方式二:直接返回视图而非重定向

修改控制器代码,直接返回视图路径,而不是发起重定向,这样就不会产生新的请求:

@Controller
public class WebController {
    @RequestMapping(value = "/status", method = RequestMethod.GET)
    public String redirect() {
        // 去掉redirect前缀,直接返回视图路径(需确保视图解析器配置正确)
        return "pages/status.html";
    }
}

这种方式下,请求/status会直接返回页面内容,不会触发新的请求,也就不会被安全规则拦截了。

额外注意点

Spring Security的<security:http>元素是按顺序匹配路径的,所以一定要把更具体的路径规则(比如/status、/pages/status.html)放在全局的/**规则前面,否则全局规则会先匹配,你的排除规则就不会生效了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:16:01