Spring Security Java 配置预览:方法安全

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

更新

用户应参考 Spring Security 参考手册,其中包含更最新的信息。

原始博文

这是四部分博文系列的第三部分。在我的 第一篇文章 中,我介绍了 Spring Security Java 配置并讨论了该项目的一些细节。在 上一篇文章 中,我们通过一些例子讲解了 Web 安全的配置。

在本文中,我将讨论如何使用 Spring Security Java 配置来配置基于方法的安全。与上一篇文章一样,我们将从一个非常基础的示例开始,然后跟进一个执行一些自定义的示例。

MethodSecurityService

虽然不是特别有趣,但假设我们有一个名为 MethodSecurityService 的服务,如下所示


public interface MethodSecurityService {
    @PreAuthorize("hasRole('ROLE_USER')")
    String requiresUserRole();
}

我们的实现同样简单,但可以确保我们将重点放在 Spring Security 而不是我们的服务上。


public class MethodSecurityServiceImpl implements 
      MethodSecurityService {
    
    public String requiresUserRole() {
        return "You have ROLE_USER";
    }
}

Hello Method Security

通过使用 @EnableGlobalMethodSecurity,我们可以轻松地通过 Java 配置来保护我们的方法。请注意,methodSecurityService 并不是我们安全配置的真正一部分,但我们必须使用 Spring 创建 MethodSecurityService,以便可以对其应用安全。


@Configuration
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class HelloMethodSecurityConfig {
  @Bean
  public MethodSecurityService methodSecurityService() {
    return new MethodSecurityServiceImpl()
  }

  @Autowired
  public void registerGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication()
          .withUser("user").password("password").roles("USER").and()
          .withUser("admin").password("password").roles("USER", "ADMIN");
    }
}

此配置与以下 XML 配置非常相似


<global-method-security pre-post-annotations="enabled"/>
<authentication-manager>
  <authentication-provider>
    <user-service>
      <user name="user" password="password" authorities="ROLE_USER"/>
    </user-service>
  </authentication-provider>
</authentication-manager>
<beans:bean id="methodSecuriytService" class="MethodSecurityServiceImpl"/>

通过我们的配置,调用 methodSecurityService bean 上的 requiresUserRole() 将要求当前用户已通过 "ROLE_USER" 角色的身份验证。如果用户未经验证或不具有 "ROLE_USER" 角色,则会抛出 AccessDeniedException。

自定义方法安全

@EnableWebSecurity 注解上有许多其他属性,但如果您想以更高级的方式自定义方法安全,则需要扩展 GlobalMethodSecurityConfiguration。下面可以看到一个自定义 PermissionEvaluator 的示例


@Configuration
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class CustomPermissionEvaluatorWebSecurityConfig extends GlobalMethodSecurityConfiguration {
  @Bean
  public MethodSecurityService methodSecurityService() {
    return new MethodSecurityServiceImpl()
  }

  @Override
  protected MethodSecurityExpressionHandler expressionHandler() {
    DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
    expressionHandler.setPermissionEvaluator(new CustomPermissionEvaluator());
    return expressionHandler;
  }
  
  @Autowired
  public void registerGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication()
          .withUser("user").password("password").roles("USER").and()
          .withUser("admin").password("password").roles("USER", "ADMIN");
    }
}

这与以下 XML 配置非常相似


<global-method-security pre-post-annotations="enabled">
  <expression-handler ref="expressionHandler"/>
</global-method-security>
<authentication-manager>
  <authentication-provider>
    <user-service>
      <user name="user" password="password" authorities="ROLE_USER"/>
    </user-service>
  </authentication-provider>
</authentication-manager>
<beans:bean id="methodSecuriytService" class="MethodSecurityServiceImpl"/>
<beans:bean id="expressionHandler" class="CustomExpressionHandler"/>

其他方法示例

我们提供了一些示例,说明如何使用 Spring Security Java 配置来通过方法级别安全性保护您的应用程序。您可以在 spring-security-javaconfig 项目的 github 仓库中找到其他示例。

请提供反馈

如果您遇到 bug、有改进的想法等,请随时提出!我们希望听到您的想法,以便在代码普遍可用之前确保我们做得正确。尽早试用新功能是回馈社区的一种良好而简单的方式。这也能确保您想要的功能存在并按您期望的方式工作。

请在 Spring Security JIRA 的 "Java Config" 类别下记录任何问题或功能请求。在记录 JIRA 后,我们鼓励(但非强制)您在 pull request 中提交您的更改。您可以在 贡献者指南 中阅读更多关于如何执行此操作的信息。

如果您有关于如何做某事的疑问,请使用 Spring Security 论坛Stack Overflow 并加上 spring-security 标签(我将密切关注它们)。如果您对这篇博文有任何具体评论或疑问,请随时留下评论。使用正确的工具将有助于让每个人都更容易。

结论

您现在应该已经了解了如何使用 Spring Security Java 配置支持来配置基于方法的安全。在 下一篇文章 中,我们将通过 OAuth Java 配置概念验证来演示 Spring Security 的扩展设计。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看所有