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

