领先一步
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 存储库中找到其他示例。
如果您遇到错误、有改进的想法等,请随时提出来!我们想听听您的想法,以便确保在代码普遍可用之前将其纠正。尽早尝试新功能是回馈社区的一种简单方法。这也确保了您想要的特性存在并按您认为应该的方式工作。
请在“Java 配置”类别下将任何问题或功能请求记录到Spring Security JIRA。记录 JIRA 后,我们鼓励(但不要求)您在拉取请求中提交您的更改。您可以在贡献者指南中阅读更多关于如何执行此操作的信息。
如果您对如何执行某些操作有疑问,请使用Spring Security 论坛或带有 spring-security 标签的 Stack Overflow(我将密切关注它们)。如果您对本博客有具体的评论或问题,请随时发表评论。使用合适的工具将使每个人都更容易。
您现在应该了解如何使用 Spring Security Java 配置支持来配置基于方法的安全。在下一篇文章中,我们将通过 OAuth Java 配置概念证明来演示 Spring Security 如何设计用于扩展。