千家信息网

SpringSecurity中的单元测试是怎样的

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,SpringSecurity中的单元测试是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。今天组里的新人迷茫的问我:
千家信息网最后更新 2025年01月19日SpringSecurity中的单元测试是怎样的

SpringSecurity中的单元测试是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

今天组里的新人迷茫的问我:哥,Spring Security弄的我单元测试跑不起来,总是401,你看看咋解决。没问题,有写单元测试的觉悟,写的代码质量肯定有保证,对代码质量重视的态度,这种忙一定要帮!

Spring Security 测试环境

要想在单元测试中使用Spring Security,你需要在Spring Boot项目中集成:

             org.springframework.security             spring-security-test             test         

这样测试的上下文配置就能和Spring Security结合起来了,接下来教你几招。

Spring Security 测试

所有的测试都是在Spring Boot Test下进行的,也就是@SpringBootTest注解的支持下。

@WithMockUser

@WithMockUser注解可以帮我们在Spring Security安全上下文中模拟一个默认名称为user,默认密码为password,默认角色为USER的用户。当你的测试方法使用了该注解后,你就能通过:

Authentication authentication = SecurityContextHolder.getContext()            .getAuthentication();

获取该模拟用户的信息,也就"假装"当前登录了用户user。当然你也可以根据需要来自定义用户名、密码、角色:

@SneakyThrows @Test @WithMockUser(username = "felord",password = "felord.cn",roles = {"ADMIN"}) void updatePassword() {      mockMvc.perform(post("/user/update/password")             .contentType(MediaType.APPLICATION_JSON)             .content("{\n" +                     "  \"newPassword\": \"12345\",\n" +                     "  \"oldPassword\": \"12345\"\n" +                     "}"))             .andExpect(ResultMatcher.matchAll(status().isOk()))             .andDo(print()); }

当然你可以将@WithMockUser标记到整个测试类上,这样每个测试都将使用指定该用户。

@WithAnonymousUser

@WithAnonymousUser是用来模拟一种特殊的用户,也被叫做匿名用户。如果有测试匿名用户的需要,可以直接使用该注解。其实等同于@WithMockUser(roles = {"ANONYMOUS"}),也等同于@WithMockUser(authorities = {"ROLE_ANONYMOUS"}),细心的你应该能看出来差别。

@WithUserDetails

虽然@WithMockUser是一种非常方便的方式,但可能并非在所有情况下都凑效。有时候你魔改了一些东西使得安全上下文的验证机制发生了改变,比如你定制了UserDetails,这一类注解就不好用了。但是通过UserDetailsService 加载的用户往往还是可靠的。于是@WithUserDetails就派上了用场。

@SneakyThrows @Test @WithUserDetails("felord") void updatePassword() {      mockMvc.perform(post("/user/update/password")             .contentType(MediaType.APPLICATION_JSON)             .content("{\n" +                     "  \"newPassword\": \"12345\",\n" +                     "  \"oldPassword\": \"12345\"\n" +                     "}"))             .andExpect(ResultMatcher.matchAll(status().isOk()))             .andDo(print()); }

当我们执行单元测试时,将通过UserDetailsService 的loadUserByUsername方法查找用户名为felord的用户并加载到安全上下文中。

自定义注解

其实我们还可以模拟@WithMockUser

@Target({ ElementType.METHOD, ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented @WithSecurityContext(factory = WithMockUserSecurityContextFactory.class) public @interface WithMockUser {     String value() default "user";     String username() default "";     String[] roles() default { "USER" };      String[] authorities() default {};      String password() default "password";      @AliasFor(annotation = WithSecurityContext.class)    TestExecutionEvent setupBefore() default TestExecutionEvent.TEST_METHOD;  }

关键就在于@WithSecurityContext注解,我们只需要实现factory就行了,也就是:

public interface WithSecurityContextFactory {      SecurityContext createSecurityContext(A annotation); }

这里如法炮制就行,没什么难度就不演示了。

今天介绍了当你的应用中集成了Spring Security时如何单元测试,我们可以使用提供的模拟用户的注解,也可以模拟加载用户,甚至你可以根据自己的需要来定制化。其实如果你使用了JWT的话还有种野路子,你可以在Spring MVC Mock测试中加入对应的请求头或者参数,也能顺利进行。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

测试 用户 注解 单元 上下 上下文 安全 也就是 代码 密码 方法 角色 质量 中集 帮助 支持 清楚 特殊 细心 迷茫 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 达梦数据库中删除字段类型的语句 资料共享服务器主板 北京互联网软件开发哪家正规 设立网络安全专职工作人员 奉贤区网络技术品牌 建行泉州分行网络安全教育 广东省ipfs云服务器云空间 关于国际服吃鸡服务器维修 军队网络安全广播稿 软件开发公司如何找客户 linux 镜像服务器 山西通讯软件开发设施参考价格 威海联想服务器总代理哪家好 宣传部网络安全管理制度 国家网络安全团课笔记 数据库数据类型转换 网络安全问题皮肤暗沉 网络安全态势是指 网络安全中学生应注意什么 数据库 execute 多媒体数据库的表现层可以分为 美国高防御服务器 在网上租的服务器应该怎么用 数据库触发器修改插入的值 第七届首都网络安全日 电影服务器最大连接数是什么意思 直播平台软件开发案例 哇噻秀 大学软件开发创业计划书 临泽网警网络安全 sql语句刷新数据库
0