Spring Security Java 配置预览:可读性

工程 | Rob Winch | 2013年7月11日 | ...

在这篇文章中,我将讨论如何提高 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();
  • #1 formLogin 更新了 http 对象本身。formLogin 的缩进从 http 的缩进增加(很像<form-login><http> 中缩进的方式)
  • #2 loginPagefailureUrl 更新了 formLogin 配置。例如,loginPage 确定 Spring Security 在需要登录时将重定向到的位置。因此,每个都是 formLogin 的子项。
  • #3 and 表示我们完成了父项(在本例中为 formLogin)的配置。这也意味着下一行将缩进减少一个级别。查看配置时,您可以将其解读为 http 使用 formLogin **和** authorizeRequests 进行配置。如果我们没有其他要配置的内容,则不需要 and
  • #4 我们使用 authorizeRequests 减少缩进,因为它与基于表单的登录无关。相反,其目的是限制对各种 URL 的访问。
  • #5 每个 antMatchersanyRequest 都修改了 authorizeRequests 的授权要求。这就是为什么每个都是 authorizeRequests 的子项的原因。

IDE 代码格式化工具

缩进可能会导致代码格式化工具出现问题。许多 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 -> 代码样式 -> 格式化程序**
  • 单击**编辑**按钮
  • 选择**Off/On 标签**选项卡
  • 确保选中**启用 Off/On 标签**
  • 您也可以在此处选择更改用于禁用和启用格式化的字符串。
  • 单击**确定**

与 XML 命名空间的比较

我们的缩进还有助于我们将 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 配置等效项之间进行转换。

获取 Spring Newsletter

通过 Spring Newsletter 保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部