Spring Security 教程(15)、安全命名空间配置

传统 XML 配置方式

xml-namespace 配图
xml-namespace 配图
xml-namespace 配图

Spring Security 最初通过 XML 命名空间提供配置方式,许多老项目仍然使用这种方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<security:http auto-config="true" use-expressions="true">
<security:intercept-url pattern="/public/**" access="permitAll"/>
<security:intercept-url pattern="/admin/**" access="hasRole('ADMIN')"/>
<security:intercept-url pattern="/**" access="authenticated"/>
<security:form-login login-page="/login"
authentication-failure-url="/login?error"/>
<security:logout logout-success-url="/logout"/>
</security:http>

<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="admin"
password="{bcrypt}$2a$10$..."
authorities="ROLE_ADMIN"/>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>

命名空间的核心元素

元素 作用
<http> 配置 HTTP 安全过滤器链
<intercept-url> 定义 URL 的访问规则
<form-login> 配置表单登录
<logout> 配置登出行为
<csrf> 配置 CSRF 防护
<authentication-manager> 配置认证管理器
<authentication-provider> 配置认证提供者
<user-service> 定义内存中的用户

从 XML 迁移到 Java Config

XML 和 Java Config 的功能完全等价。迁移时遵循以下规则:

XML 配置 Java Config 等价写法
<http auto-config="true"> http.authorizeRequests().anyRequest().authenticated()
<intercept-url pattern="/public/**" access="permitAll"/> .requestMatchers("/public/**").permitAll()
<form-login login-page="/login"/> .formLogin().loginPage("/login")
<authentication-manager> + <user-service> auth.inMemoryAuthentication().withUser(...)

什么时候继续用 XML

尽管 Java Config 是推荐方式,但以下情况 XML 可能更合适:

  • 老旧项目不想大规模重构
  • 需要与已有的 XML 配置体系保持一致
  • 团队对 XML 更熟悉
  • 安全配置需要非开发人员(如运维)手动修改

混合使用

Spring Security 允许 XML 和 Java Config 混合使用。你可以在 Java Config 中导入 XML 配置:

1
2
3
@ImportResource("classpath:security-config.xml")
@Configuration
public class SecurityConfig { }

或者在 XML 中引用 Java Config 的 Bean:

1
<bean id="customFilter" class="com.example.CustomFilter"/>

混合使用时,Java Config 优先于 XML 配置。