当前位置: 首页 > 知识库问答 >
问题:

在使用JUnit测试Spring Security性时,如何删除“ROLE\”前缀?

颜哲彦
2023-03-14

一些背景:我们有一个联调类,用于测试与Spring授权一起使用的常量SPEL字符串。简单的例子:

@SpringBootTest
@RunWith(SpringRunner.class)
public class HasRoleConstantsTest {
    @Test
    @WithMockUser(username = "uname", roles = "ADMIN")
    public void test() {
        // just calling some test method with appropriate annotation
    }
}

前面提到的常量的用法如下:

@PreAuthorize(PREDEFINED_AUTHORIZATION_RULE)

其中常量可以是一些更复杂的检查,如:

public static final String PREDEFINED_AUTHORIZATION_RULE =
    "hasRole('ADMIN') OR (hasRole('MAINTAINER') AND hasRole('#id'))"

我们已经按照此处的建议配置了Web安全配置,因此添加了类似bean的:

@Bean
GrantedAuthorityDefaults grantedAuthorityDefaults() {
    return new GrantedAuthorityDefaults(""); // Remove the ROLE_ prefix
}

除了文章顶部显示的测试失败之外,一切都很顺利,因为在测试环境中,Spring security仍然会为每个模拟用户角色添加前缀ROLE\u1。

有没有人能解释一下应该如何配置测试类,或者-例如-应该如何操作SecurityContext来在测试中去掉这个前缀?

共有2个答案

叶富
2023-03-14

这对我来说很好:

配置:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class GlobalMethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    private final ApplicationContext context;

    @Autowired
    public GlobalMethodSecurityConfig(ApplicationContext context) {
        this.context = context;
    }

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        DefaultMethodSecurityExpressionHandler handler = 
            new DefaultMethodSecurityExpressionHandler();

        handler.setDefaultRolePrefix("");
        handler.setApplicationContext(context);
        return handler;
    }
}

测验:

@Test
@WithMockUser(roles = "USER")
void getCard() {
    ...
}

如果这没有帮助,您能否在GitHub上显示一个工作代码示例?(这可能有助于发现问题)

顾嘉德
2023-03-14

很简单,打开这个注释的javadoc并使用权限而不是角色

 类似资料:
  • 我有一个使用JSONObject的函数,我需要测试它。下面是我的代码: 这是我想测试的代码: 谢谢

  • 我知道JMeter是一个很好的性能工具。 不幸的是,对于性能测试,我只有:Selenium、Junit、Jenkins(或者Jenkins的其他插件,你知道吗?) 我有用Selenium编写的Junit测试。 Jenkins中的每个节点都能服务5个线程。在多台机器上并行运行测试(在Chrome中)以轻松检查每个测试是否会在相似的时间通过,这是一个好的解决方案吗? 也许你有另一种使用Selenium

  • 问题内容: 目前,我有以下 build.gradle 文件: 这 的build.gradle 文件是我的仓库 在这里 。我所有的主文件都在 src / model /中 ,它们各自的测试在 test / model中 。 如何正确添加JUnit 4 依赖项 ,然后在 测试/模型 文件夹中运行那些测试? 问题答案: 如何正确添加junit 4依赖关系? 假设您要针对标准Maven(或等效版本)存储库

  • 我想为我的一个编写一个简单的测试,并断言输入已正确映射到: 问题:如何向该servlet发送请求正文。然后再检查一下字段是否都设置正确? 这可能与此类似,但我不知道如何检查/监视已解析的DTO? @重复标记:这不是链接问题(关于如何读取响应正文字符串)的重复。我实际上是在要求进行身体测试。

  • 当前我有以下build.gradle文件: 此build.gradle文件用于我的存储库。我的所有主文件都在src/model/中,它们各自的测试都在test/model中。

  • 问题内容: 我试过了: 但是,CRaSSHD仍会启动。尽管目前它不会损害测试,但我想在单元测试期间禁用不必要的模块,以加快速度并避免潜在的冲突。 问题答案: 最佳答案并不指向更简单,更灵活的解决方案。 只是放置一个 测试类上方的注释。这意味着其他测试不受当前测试的特殊情况的影响。如果存在影响大多数测试的配置,请考虑使用spring配置文件代替当前的最佳答案。 感谢@skirsch鼓励我将其从评论升