领先一步
VMware 提供培训和认证,助您加速进步。
了解更多用户应参考 Spring Security 参考手册,其中包含更最新的信息。
这是四部分博文系列的第三部分。在我的 第一篇文章 中,我介绍了 Spring Security Java 配置并讨论了该项目的一些细节。在 上一篇文章 中,我们通过一些例子讲解了 Web 安全的配置。
在本文中,我将讨论如何使用 Spring Security Java 配置来配置基于方法的安全。与上一篇文章一样,我们将从一个非常基础的示例开始,然后跟进一个执行一些自定义的示例。
虽然不是特别有趣,但假设我们有一个名为 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";
}
}
通过使用 @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 的扩展设计。