Spring Security Java 配置预览:可读性

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

在本文中,我将讨论如何让您的 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();
  • #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

为了使此功能正常工作,请确保您已启用它

  • 导航至 Preferences -> Java -> Code Style -> Formatter
  • 点击 Edit 按钮
  • 选择 Off/On Tags 选项卡
  • 确保选中了 Enable Off/On tags
  • 您还可以选择在此处更改用于禁用和启用格式化的字符串。
  • 点击 OK

与 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 新闻通讯

订阅 Spring 新闻通讯,保持联系

订阅

抢占先机

VMware 提供培训和认证,助您加速前行。

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部