@WithMockUser 具有自定义用户实现

2023-11-25

我正在使用 spring OAuth2 和 JWT 令牌来保护应用程序。我正在延长org.springframework.security.core.userdetails为了向令牌添加一些附加属性,然后可以使用这些属性来执行授权,调用端点。

public class CustomUser extends User {
     private Set<String> bookIds;

     public CustomUser(String username, String password, Collection<? extends GrantedAuthority> authorities) {
         super(username, password, authorities);
     }

     public CustomUser(String username, String password, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) {
         super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
     }
}

我还有 org.springframework.security.access.PermissionEvaluator 的自定义实现,它能够反序列化令牌并检查自定义属性是否是其中的一部分,可以将其添加到控制器端点。

@PreAuthorize("hasPermission(authentication, #bookId,'read')")

现在一切正常,我可以通过邮递员测试我的应用程序,并且只有具有有效 JWT 令牌且其 bookIds 集的 URL 部分中包含 bookID 的用户才能访问该资源

@PreAuthorize("hasPermission(authentication, #bookId,'read')")
@GetMapping(value = "api/books/{bookId}")
public Book getBook(@PathVariable String bookId) {}

然而,我正在努力测试它,因为这是微服务应用程序的一部分,其中身份验证和服务不属于同一项目,并且将在单独的虚拟机上运行。理想情况下,我希望能够模拟每个服务中的令牌,并在此 bookId 集中添加我需要的任何值。 我知道在 spring 4 之后我们可以使用 @WithMockUser,但是,据我所知,这仅限于用户名/密码/角色/权限,例如:

@WithMockUser(username = "ram", roles={"ADMIN"})

我真正想做的是扩展此注释以支持我的自定义属性“bookId”或在其中注入模拟集的方法。这是否可能,如果不可能,我的替代方案是什么,因为我无法在单元测试中调用我的身份验证提供程序,因为该实现将存在于托管在单独应用程序上的另一个 spring 上下文中。

提前谢谢了 !


您可以使用@WithUserDetails注解。
如果您有一个用户名为“user1”的用户,那么您可以使用以下方式注释您的测试@WithUserDetails("user1")它将执行CustomUser主体,包括与“user1”关联的自定义属性“bookId”。
您可以在中找到有关注释的更多信息spring-security 文档.

如果您想要更大的灵活性,您还可以使用@WithSecurityContext注解。
这允许您创建自己的注释,例如@WithMockCustomUser,您可以在其中自行设置安全上下文。
您可以在以下位置找到更多详细信息spring-security 文档.

如果您正在使用,还有一个选项MockMvc运行你的测试,它使用请求后处理器.
你的测试看起来像这样

mvc
    .perform(get("/api/books/1")
    .with(user(customUser)));

where customUser是一个实例CustomUser您在测试中创建的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@WithMockUser 具有自定义用户实现 的相关文章

随机推荐

  • 变更数据捕获或变更跟踪 - 与传统审计跟踪表相同吗?

    在我深入研究 Microsoft 文档的深渊之前 我想知道有变更数据捕获和变更跟踪经验的人是否知道其中之一或两者是否可以用来取代传统的 审计追踪表副本 真实 table 原始表的所有字段 加上日期 时间 用户 ID 和 DML 动作字段 插
  • 您能推荐 PHP 性能分析工具吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 谁能推荐一些有用的 PHP
  • 非静态成员函数的 decltype 格式是否错误?

    我不确定是否完全理解 dcl type 4 3 对于一个表达式e 表示的类型decltype e 定义如下 4 3 否则 如果e是不带括号的 id 表达式或不带括号的类成员访问 decltype e 是命名实体的类型e 如果没有这样的实体
  • 如何在 Java 中使用正则表达式查找重复字符?

    谁能给我一个 Java 正则表达式来识别字符串中的重复字符 我只寻找立即重复的字符 它们可以是字母或数字 Example abcccde abcde Try w 1 The w匹配任何单词字符 字母 数字或下划线 并且 1 匹配第一组括号中
  • Javascript:未定义为函数参数

    On this page 它显示了一些示例代码 包含以下行 var Subject function window undefined 是什么undefined作为函数参数 这用于防止覆盖值undefined在非严格模式下 在非严格模式下
  • SendMessage,什么时候使用KEYDOWN,SYSKEYDOWN等?

    我正在编写一个应用程序 使用以下命令将击键发送到另一个应用程序SendMessage DllImport user32 dll public static extern int SendMessage IntPtr hWnd int Msg
  • C++11 lambda 到函数指针

    我开始使用 C 11 lambda 开发应用程序 并且需要将某些类型转换为函数指针 这在 GCC 4 6 0 中完美运行 void test puts Test test 我的问题是当我需要在 lambda 中使用函数或方法局部变量时 co
  • PrintWriter 和 DataOutputStream 有什么区别?

    我正在开发一个 Android 聊天室应用程序 我阅读了不同的教程 有些使用PrintWriter发送数据 有些使用DataOutputStream 这两者有什么区别 哪一个更适合聊天应用程序 来自java文档 A 数据输出流允许应用程序以
  • Django 中的 related_name 和 related_query_name 是什么?

    我对 django 框架中的代码有一个问题related name 和 related query name在 Django 中 请django专家解释一下django中的 related name 代码如下 相关名称 相关名称 Djang
  • 适合多个客户的 Android 构建配置

    我有一个 Android 应用程序需要交付给多个客户 对于每个客户 我都有不同的图形和配置 XML 文件 其中指定了功能和 URL 在构建时 我们应该能够指定应为其构建应用程序的客户 然后 应将适合指定客户端的资源 例如图像和运行时配置 内
  • 仅当字段不为 Null 时才验证

    I use JSR303 Spring Validation我有以下内容 Digits fraction 0 integer 15 private String tpMobile 验证说Must be number between 10 1
  • 如何在 Java 中解密 sha1 加密的字符串

    是否有可能解密一些之前用 Java 中的 SHA 1 算法加密的字符串 SHA1 是加密哈希函数 重点是您无法撤消它 如果可以反转哈希值 找到给定哈希值的输入 那么它就没有用处 如果您需要加密某些内容然后解密它 您应该使用加密功能 like
  • 如何将参数 n 传递给 printf("%nd", some_int);

    我们都知道在基于 C 的语言中 printf 11d some int 意味着在 11 个字符字段内右对齐 但是如果我想用动态变量替换这里的常量 11 我该怎么办 您可以使用 字符在其自己的参数中指定字段宽度 printf d some w
  • PHP 从多维数组创建消息线程的多维数组 (IMAP)

    我的问题如下 如果你往下看 你会看到有一个带有消息 ID 的数据结构 然后是包含消息详细信息的最终数据结构 这些详细信息应该从imap fetch overview 消息 ID 来自imap thread 问题是它没有将电子邮件详细信息放在
  • Firestore 如果文档不存在则创建文档,如果存在则跳过

    我想创建 Firestore 文档 如果它们不存在 如果它们确实存在 请跳过它们 不更新 这是流程 var arrayOfRandomIds array of 500 random numbers for var id of arrayOf
  • AWS Athena 上的 OFFSET

    我想在 AWS Athena 上运行查询LIMIT and an OFFSET条款 我认为前者受到支持 而后者不是 有没有办法使用其他方法来模拟此功能 Using OFFSET分页效率非常低 特别是对于像 Presto 这样经常需要执行全表
  • Dataflow/Apache Beam 在哪个阶段确认 pub/sub 消息?

    我有一个数据流流作业 其中 Pub Sub 订阅作为无限源 我想知道数据流在哪个阶段确认传入的发布 订阅消息 在我看来 如果在数据流管道的任何阶段抛出异常 消息就会丢失 另外 我想知道如何使用发布 订阅无界源编写数据流管道的最佳实践 以便在
  • R 编程:predict(),“预测”与“置信度”?

    无论如何学习 R 在只有 x 和 y 的简单回归中 我输入 predict data1 lm interval prediction and predict data1 lm interval confidence 我很困惑有什么区别 我在
  • Docker maven 插件 ClientProtocolException(Windows 10 使用 Docker Toolbox)

    我正在尝试使用 docker maven plugin 构建 docker 映像 由 spotify 提供 https github com spotify docker maven plugin 但事情并没有真正解决 起初我得到了这个例外
  • @WithMockUser 具有自定义用户实现

    我正在使用 spring OAuth2 和 JWT 令牌来保护应用程序 我正在延长org springframework security core userdetails为了向令牌添加一些附加属性 然后可以使用这些属性来执行授权 调用端点