JAX-RS:自定义 SecurityContext 在注入资源方法时具有意外类型

2024-01-11

我已经实施了一个ContainerRequestFilter执行基于 JWT 的身份验证:

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        AuthenticationResult authResult = ...
        if (authResult.isSuccessful()) {
            // Client successfully authenticated.
            // Now update the security context to be the augmented security context that contains information read from the JWT.
            requestContext.setSecurityContext(new JwtSecurityContect(...));
        } else {
            // Client provided no or an invalid authentication token.
            // Deny request by sending a 401 response.
            requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
        }
    }
}

如你所见,我更新了SecurityContext请求的,将其设置为我自己的自定义实现的实例(JwtSecurityContext) 如果验证成功。此实现添加了额外的身份验证和授权数据,我希望稍后在后续过滤器和资源方法中访问这些数据。

我还实施了一个AuthorizationFilter在之后立即调用AuthenticationFilter。在这里,我可以访问更新的JwtSecurityContext正好。

但是,当我尝试注入时遇到问题JwtSecurityContext到资源(方法)中。

我目前正在使用 Jersey,并且我在其文档中阅读了以下内容 https://jersey.java.net/documentation/latest/security.html#d0e12280:

The SecurityContext可以直接从中检索ContainerRequestContext via getSecurityContext()方法。你也可以 替换默认值SecurityContext在具有自定义的请求上下文中 一个使用setSecurityContext(SecurityContext)方法。如果您设置了 风俗SecurityContext实例在你的ContainerRequestFilter, 这 安全上下文实例将用于注入 JAX-RS 资源类字段。这样你就可以实现一个自定义的 可以设置您自己的身份验证过滤器SecurityContext成为 用过的。确保您的自定义身份验证的尽早执行 请求过滤器,将过滤器优先级设置为 AUTHENTICATION 使用 常数来自Priorities。尽早执行您的身份验证 过滤器将确保所有其他过滤器、资源、资源方法 子资源定位器将按照您的自定义执行SecurityContext实例。

我尝试注入JwtSecurityContext进入资源方法,如下所示:

@Path("/somepath")
public class SomeResource {
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<SomeItem> getItems(@Context SecurityContext securityContext) {
        // securityContext is of type 'SecurityContextInjectee'
    }
}

正如注释所示,运行时类型securityContext变量变为SecurityContextInjectee。通过调试,我发现这包含了ContainerRequest这反过来又包裹了我的JwtSecurityContext。但是,没有吸气剂,而且我不想使用反射来深入了解这个对象层次结构,所以我不知道如何掌握我的JwtSecurityContext.

我尝试过改变@Context SecurityContext securityContext to @Context JwtSecurityContext jwtSecurityContext,但如果我这样做,变量就会变成null。我也尝试过字段注入,但其行为是相同的。

我是否走错了路?我是否应该访问我的自定义SecurityContext在我的资源方法中?一种替代方法是将我的所有数据包装在Principal我返回的实现getUserPrincipal in my JwtSecurityContext。我想代理(SecurityContextInjectee) 会将调用转发给其底层JwtSecurityContext因此归还我的Principal,但我不确定,最终我更愿意使用我的JwtSecurityContext而不是将这些值包装在Principal执行。


您可以注入ContainerRequestContext(如中提到的这个帖子 https://stackoverflow.com/a/27666797/2587435)然后得到SecurityContext从那里。

public List<SomeItem> getItems(@Context ContainerRequestContext context) {
    JwtSecurityContext sec = (JwtSecurityContext)context.getSecurityContext();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAX-RS:自定义 SecurityContext 在注入资源方法时具有意外类型 的相关文章

  • React Native + Redux 基本身份验证

    我正在寻找一种为我的反应本机应用程序创建基本身份验证的方法 我找不到任何反应本机应用程序的好例子 要登录 应用程序将电子邮件 密码 clientSecret 发送到我的服务器 如果OK 服务器返回accessToken refreshTok
  • Criteria eager fetch-joined 集合以避免 n+1 选择

    假设 Item 和 Bid 是实体 一个 Item 有多个 Bid 它们被映射到休眠在典型的父子关系中
  • 逐行读取 JTextPane

    有没有办法读取a的内容JTextPane逐行 很像 BufferedReader 吗 Element root textPane getDocument getDefaultRootElement 获得根元素后 您可以检查存在多少个子元素
  • 从 Java 启动外部进程:stdout 和 stderr

    我正在使用标准从 java 启动一个外部进程java lang Process 我试图弄清楚该过程的输出是什么 但是采用结合了两者的格式stdout and stderr 目前 我有Process getInputStream它提供了访问s
  • 平衡括号问题的优化解

    给定一个仅包含字符的字符串 and 判断输入字符串是否有效 输入字符串在以下情况下有效 左括号必须由相同类型的括号封闭 左括号必须按正确的顺序关闭 请注意 空字符串也被视为有效 示例1 Input Output true Example 2
  • Eclipse 内容协助无法在枚举常量参数列表中工作

    使用 eclipse 当我输入以下内容时 public enum Foo A Integer private final Integer integer private Foo Integer integer this integer in
  • Java 中的 TreeSet 与 C#.net 的等效项

    我有 Java 代码 其中包含TreeSet 我想将代码转换为 C 我可以使用哪个等效集合 如果没有 请提出替代方案 那将是系统 集合 通用 SortedSet
  • Hibernate、MySQL 视图和 hibernate.hbm2ddl.auto = 验证

    我可以在 Hibernate 中使用 MySQL 视图 将它们视为表 即 该实体与为表创建的实体没有什么不同 但是 当 Hibernate 设置为验证模型时 我的应用程序将不会部署 因为它找不到视图 因为它假设它是一个表 是否可以在启用部署
  • 读取 Nashorn JO4 和 NativeArray

    Java调用代码 import jdk nashorn api scripting myCustomHashMap dataStore new myCustomHashMap ScriptEngineManager sem new Scri
  • 当用户使用相同的凭据登录两次时如何使用户会话无效

    我正在使用带有 Richfaces 和 Facelets 的 JSF 1 2 我有一个应用程序 其中包含许多会话范围的 Bean 和一些应用程序 Bean 假设用户使用 Firefox 登录 创建一个会话 ID A 然后他打开 Chrome
  • Android Google 地图:隐藏整个地图的多边形或形状

    我试图隐藏除一个区域之外的整个地图 因为我使用的多边形在我想要显示的区域中有一个洞 问题在于 根据缩放的不同 空白区域会被多边形的颜色覆盖 或者多边形会失去其颜色 这是代码 polygon hide all world map float
  • APACHE POI 从 Java 中的 Excel 获取精确的字体颜色

    在 Excel 工作表中 如何使用 Java 中的 Apache POI 获取准确的字体颜色值 我试图通过使用来获取字体颜色 org apache poi ss usermodel Font f book getFontAt style g
  • 使用 Lint 和 SonarQube 分析 Android 项目

    我真的 溢出 了试图让这些东西一起工作 我按照这里的指示进行操作 http docs sonarqube org display PLUG Android Lint Plugin http docs sonarqube org displa
  • 如何使 RSACryptoServiceProvider 在没有填充(nopadding)的情况下工作?

    我需要使 C 应用程序与 Java 应用程序兼容 Java 应用程序使用Cipher getInstance RSA ECB nopadding 初始化器使密码 ECB 和无填充 但是 在 C 中 您有 2 个填充选项 OAEP 填充或 P
  • 错误:列“this_.phitorsionangle”必须出现在 GROUP BY 子句中或在聚合函数中使用

    我在执行 sql 查询时遇到了一些问题 我正在使用 Hibernate Criteria 来构建查询 我通过按一定间隔 binSize 舍入值然后对它们进行分组来从数据库创建一些容器 当我直接在 SQL 中使用查询尝试时 效果非常好 SEL
  • 从字符串中提取文本 Java

    使用此字符串 ADACADABRA 如何从java中的字符串 ADACADABRA 中提取 CADA 以及如何提取 和 之间的id从下面的链接 http www youtube nocookie com embed zaaU9lJ34c5
  • 飞碟 - html 实体未呈现

    我正在使用 Flying saucer lib 生成 pdf 但我对一些 html 实体有问题 我已经在寻找解决方案 我在这个论坛和其他地方找到了很多提示 但仍然存在问题 我尝试过这种方法 http sdtidbits blogspot c
  • 解析 SWIG 接口文件的结构属性

    这是我不久前问过的问题的延续 为通过参数返回的函数创建类型映射 https stackoverflow com questions 12793973 create a typemap for a function that returns
  • 需要同步仅增量计数器吗?

    我使用整数作为计数器 该整数只会增加 并且肯定有多个线程会同时增加它 当没有其他线程尝试访问其值时 在程序执行结束时读取该计数器的值 我假设我不必为这种仅增量计数器使用锁或任何类型的同步 这是正确的吗 如果这有什么区别的话 我用 Java
  • Java:如何检测(并更改?)System.console 的编码?

    我有一个在控制台上运行的程序 其变音符号和其他特殊字符在 Mac 上以 的形式输出 这是一个简单的测试程序 public static void main String args System out println h h System

随机推荐