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 存储库中找到其他示例。

请提供反馈

如果您遇到错误、有改进的想法等,请随时提出来!我们想听听您的想法,以便确保在代码普遍可用之前将其纠正。尽早尝试新功能是回馈社区的一种简单方法。这也确保了您想要的特性存在并按您认为应该的方式工作。

请在“Java 配置”类别下将任何问题或功能请求记录到Spring Security JIRA。记录 JIRA 后,我们鼓励(但不要求)您在拉取请求中提交您的更改。您可以在贡献者指南中阅读更多关于如何执行此操作的信息。

如果您对如何执行某些操作有疑问,请使用Spring Security 论坛带有 spring-security 标签的 Stack Overflow(我将密切关注它们)。如果您对本博客有具体的评论或问题,请随时发表评论。使用合适的工具将使每个人都更容易。

结论

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

获取Spring通讯

通过Spring通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加快您的进度。

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看全部