【发布时间】:2013-10-18 14:37:51
【问题描述】:
假设我有如下方法:
@PreAuthorize("hasPermission(#obj, 'READ')")
public void requiresReadPermission(Object obj) {}
是否有一种简单的方法可以模拟/授予/拒绝身份验证的“READ”权限?
【问题讨论】:
标签: spring spring-security spring-test spring-security-acl
假设我有如下方法:
@PreAuthorize("hasPermission(#obj, 'READ')")
public void requiresReadPermission(Object obj) {}
是否有一种简单的方法可以模拟/授予/拒绝身份验证的“READ”权限?
【问题讨论】:
标签: spring spring-security spring-test spring-security-acl
由于它是方法的单元测试,而不是给定拦截器的单元测试,因此您无需担心身份验证和 ACL 基础结构。如果您想测试在未授予用户访问对象时抛出AccessDeniedException,请对拦截器本身进行单元测试。在您的情况下,只需测试您的方法是否执行/返回预期执行/返回的操作。
如果身份验证未授予对给定对象的访问权限,Spring Security ACL 方法拦截器将抛出 AccessDeniedException 如上所述,并在 AccessDeniedHandler 或直接或间接调用受保护的方法的 catch 块中进行处理方法。如果这是您的情况,则组件有责任根据您的安全方法正确处理异常。
此类组件的单元测试可以使用注入安全方法的组件模拟来创建组件,并模拟抛出AccessDeniedException。然后检查异常处理是否正确。
【讨论】:
AccessDeniedException 但在现实世界中它确实返回了,那么配置单元测试时缺少什么?