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

非SpringBoot项目中Spring4的Spring Security基础认证不生效问题

问题根因

你遇到的配置不生效问题核心是两个常见的Spring Security传统项目配置疏漏:

  • 没有在web.xml中注册Spring Security的核心过滤器链,仅靠@EnableWebSecurity注解只会在Spring上下文生成安全配置Bean,不会被Servlet容器识别处理请求
  • 若你使用的是Spring Security 4.x版本(对应Spring4生态),配置中的{noop}密码前缀是Spring Security 5.x才引入的,会导致密码校验逻辑异常

解决步骤

1. 注册Spring Security过滤器到web.xml

在web.xml的<listener>节点之后、<servlet>节点之前添加以下过滤器配置,注意filter-name必须固定为springSecurityFilterChain,不能自定义:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2. 确认安全配置类被根上下文扫描

确保BasicAuthConfig所在的org.example包,在ContextLoaderListener加载的/WEB-INF/applicationContext.xml中被配置了组件扫描,示例配置:

<context:component-scan base-package="org.example"/>

不要把安全配置类放到DispatcherServlet的上下文(即rest-servlet.xml的扫描范围)中,会导致过滤器找不到对应的Bean报错。

3. 适配Spring Security版本的密码配置

如果你的Spring Security版本是4.x系列,删除密码前的{noop}前缀即可,修改后的认证配置如下:

@Override
protected void configure(AuthenticationManagerBuilder auth)
        throws Exception {
    auth.inMemoryAuthentication()
            .withUser("appuser")
            .password("apipassword")
            .roles("USER");
}

如果要保留明文密码配置也可以显式注入NoOpPasswordEncoder,避免版本兼容问题。


验证

配置完成后重启服务,访问/rest/health接口会弹出HTTP Basic认证框,输入配置的用户名密码即可正常访问,未携带认证信息的请求会直接返回401未授权状态码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:24:02