抢占先机
VMware 提供培训和认证,助您加速前行。
了解更多在本文中,我将讨论如何让您的 Spring Security Java 配置更具可读性。本文旨在阐述 Spring Security Java 配置预览:Web Security 一文中的一个观点,我在文中提到
通过格式化我们的 Java 配置代码,可以使其更容易阅读。它读起来类似于 XML 命名空间等效配置,其中 “and()” 代表可选地关闭一个 XML 元素。
Spring Security Java 配置的缩进确实会影响其可读性。通常,应优先采用类似项目列表的缩进方式。
为了更具体的示例,请看下面的代码
http
// #1
.formLogin()
// #2
.loginPage("/login")
.failureUrl("/login?error")
// #3
.and()
// #4
.authorizeRequests()
// #5
.antMatchers("/signup","/about").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated();
formLogin
更新 http
对象本身。formLogin
的缩进级别比 http
增加了一级(很像 <form-login>
相对于 <http>
的缩进方式)loginPage
和 failureUrl
更新 formLogin
配置。例如,如果需要登录,loginPage
决定 Spring Security 将重定向到哪里。因此,每个都是 formLogin
的子项。and
表示我们已完成对父级(在本例中为 formLogin
)的配置。这也意味着下一行将减少一级缩进。查看配置时,您可以将其读作 http
配置了 formLogin
以及 authorizeRequests
。如果我们没有其他要配置的内容,则 and
不是必需的。authorizeRequests
减少了缩进级别,因为它与基于表单的登录无关。相反,它的目的是限制对各种 URL 的访问。antMatchers
和 anyRequest
修改了 authorizeRequests
的授权要求。这就是为什么每个都是 authorizeRequests
的子项。缩进可能会与代码格式化工具产生冲突。许多 IDE 允许您通过注释禁用特定代码块的格式化。例如,在 STS/Eclipse 中,您可以使用注释 @formatter:off 和 @formatter:on 来关闭和开启代码格式化。示例如下所示
// @formatter:off
http
.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.and()
.authorizeRequests()
.antMatchers("/signup","/about").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated();
// @formatter:on
为了使此功能正常工作,请确保您已启用它
我们的缩进也有助于我们将 Java 配置与 XML 命名空间配置联系起来。这并非总是如此,但确实有帮助。让我们将我们的配置与下面的相关 XML 配置进行比较。
http
.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.and()
.authorizeRequests()
.antMatchers("/signup","/about").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated();
下面是相关的(但不完全等效的)XML 配置。请注意,Spring Security 在这些配置之间行为的差异是由于 Java 配置和 XML 配置之间的默认值不同。
<http use-expressions="true">
<form-login
login-page="/login"
authentication-failure-url="/login?error"
/> <!-- similar to and() -->
<intercept-url pattern="/signup" access="permitAll"/>
<intercept-url pattern="/about" access="permitAll"/>
<intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
</http>
http
和 <http>
非常相似。一个区别是 Java 配置使用 authorizeRequests
来指定 use-expressions="true"
formLogin
和 <form-login>
非常相似。formLogin
的每个子项都是 <form-login>
的 XML 属性。根据我们对缩进的解释,这种相似性是合乎逻辑的,因为 XML 属性修改 XML 元素。formLogin
下的 and()
与结束一个 XML 元素非常相似。authorizeRequests
的每个子项都类似于每个 <intercept-urls>
,不同之处在于 Java 配置指定 requires-channel 的方式不同,这有助于在许多情况下减少配置。您现在应该知道如何一致地缩进您的 Spring Security Java 配置了。这样做可以使您的代码更具可读性,并且更容易与 XML 配置等效项进行相互转换。