使用 Spring Security ACL 注释对方法进行单元测试的最佳方法是啥?

Posted

技术标签:

【中文标题】使用 Spring Security ACL 注释对方法进行单元测试的最佳方法是啥?【英文标题】:What is the best way to unit test methods annotated with Spring Security ACL annotations?使用 Spring Security ACL 注释对方法进行单元测试的最佳方法是什么? 【发布时间】:2013-10-18 14:37:51 【问题描述】:

假设我有如下方法:

@PreAuthorize("hasPermission(#obj, 'READ')")
public void requiresReadPermission(Object obj) 

是否有一种简单的方法可以模拟/授予/拒绝身份验证的“READ”权限?

【问题讨论】:

【参考方案1】:

由于它是方法的单元测试,而不是给定拦截器的单元测试,因此您无需担心身份验证和 ACL 基础结构。如果您想测试在未授予用户访问对象时抛出AccessDeniedException,请对拦截器本身进行单元测试。在您的情况下,只需测试您的方法是否执行/返回预期执行/返回的操作。

如果身份验证未授予对给定对象的访问权限,Spring Security ACL 方法拦截器将抛出 AccessDeniedException 如上所述,并在 AccessDeniedHandler 或直接或间接调用受保护的方法的 catch 块中进行处理方法。如果这是您的情况,则组件有责任根据您的安全方法正确处理异常。

此类组件的单元测试可以使用注入安全方法的组件模拟来创建组件,并模拟抛出AccessDeniedException。然后检查异常处理是否正确。

【讨论】:

我使用的是 JUnit 4,如果在单元测试期间它没有返回 AccessDeniedException 但在现实世界中它确实返回了,那么配置单元测试时缺少什么?

以上是关于使用 Spring Security ACL 注释对方法进行单元测试的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

spring security acl 不比较按位权限

使用 Spring Security ACL

Spring Security 的 ACL 配置问题

Spring Security - ACL readAclsById 不按 SID 过滤

Spring Security ACL 层次结构

如何使用 Spring Security、Hibernate 和行级 ACL 进行分页