spring security xml配置适用于旧版(如4.2.x),需在applicationcontext-security.xml中定义命名空间、http安全规则、authentication-manager等,并通过web.xml加载;但自spring 5/boot 2.0起官方主推java config,xml不再维护且boot默认不支持。

Spring Security 的 XML 配置在较老版本(如 Spring 3.x / 4.x)中常用,但自 Spring 5 和 Spring Boot 2.0 起,官方已强烈推荐使用 Java Config(@Configuration + WebSecurityConfigurerAdapter 或新式 SecurityFilterChain),XML 方式不再被积极维护,且 Spring Boot 默认不支持 XML 安全配置。
不过如果你维护遗留项目、必须用 XML,或学习传统配置逻辑,以下是典型、可运行的 Spring Security XML 配置要点和示例(基于 Spring Security 4.2.x + Spring 4.x):
基础 XML 配置结构
需在 Spring 的主配置文件(如 applicationContext-security.xml)中定义,确保引入正确命名空间:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
https://www.springframework.org/schema/security/spring-security.xsd">
<!-- 开启 HTTP 安全配置 -->
<http auto-config="true">
<intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
<intercept-url pattern="/user/**" access="ROLE_USER"/>
<intercept-url pattern="/**" access="permitAll"/>
<form-login login-page="/login" default-target-url="/home"/>
<logout logout-success-url="/login?logout"/>
</http>
<!-- 用户服务配置(内存示例) -->
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="{noop}123456" authorities="ROLE_ADMIN"/>
<user name="user" password="{noop}123456" authorities="ROLE_USER"/>
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>注意:
- `{noop}` 表示明文密码(仅用于测试),生产环境必须用 `{bcrypt}` 等加密前缀 + 编码后密码
- `auto-config="true"` 自动启用 form-login、csrf、logout 等常见功能;设为 `false` 则需手动配置每项
- 该 XML 文件需被 Spring 容器加载,例如在 web.xml 中通过 `ContextLoaderListener` 引入:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
classpath:applicationContext-security.xml
</param-value>
</context-param>关键配置项说明
常见需求对应 XML 写法:
-
关闭 CSRF(仅调试用): `
` 放在 ` ` 内 -
自定义登录成功/失败跳转: `
ailure-handler-ref="myFailureHandler"/>`(需提前定义 Bean) -
JDBC 认证: 替换 `
` 为 ` `,并确保 `dataSource` Bean 已定义 -
角色层级(如 ROLE_ADMIN 可访问 ROLE_USER 资源): 在 `
` 外加 ` access-control>` 或用 ` ` 配合自定义 `RoleHierarchy` Bean
与 Web 集成要点
XML 配置生效的前提:
- 确保 `spring-security-web` 和 `spring-security-config` JAR 在 classpath(Maven 依赖需齐全)
- 在 `web.xml` 中注册 Spring Security 过滤器链:
<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>这是核心——没有它,XML 配置完全不会执行。
为什么不推荐继续用 XML?
不是“不能用”,而是现实约束明显:
- XML 无法利用 Java 编译期检查,配错属性名或值类型只能运行时报错
- 复杂逻辑(如动态权限、OAuth2、JWT 解析)在 XML 中难以表达,最终还得写 Java 类+注入
- Spring Boot 项目默认忽略 XML 安全配置,强行启用需额外排除自动配置、手动注册 `FilterChainProxy`,得不偿失
- 社区支持、文档、Stack Overflow 示例几乎全部转向 Java Config
基本上就这些。真要维护 XML 项目,建议逐步将安全逻辑抽成 `AuthenticationProvider`、`AccessDecisionVoter` 等 Java 组件,再由 XML 引用,为后续迁移铺路。










