领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多在这篇文章中,我将讨论如何提高 Spring Security Java 配置的可读性。这篇文章旨在详细阐述 Spring Security Java 配置预览:Web 安全性 中我提到的一点
通过格式化我们的 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 配置等效项之间进行转换。