gpt4 book ai didi

servlets - 带有安全过滤器和依赖注入(inject)的 jax-rs 1.1,如何实现这一点?

转载 作者:行者123 更新时间:2023-12-05 00:55:41 25 4
gpt4 key购买 nike

例如,我有以下 JAX-RS 1.1 接收 JWT token 的方法,检查它,然后处理或拒绝请求,如下所示:

@GET
public Response getBook(@HeaderParam("Authorization") String authorizationToken, @QueryParam("id") String bookId) {

//if(authorizationToken is a valid JWT token)
// get User object which represented by this token
// get required book from database
// return 200 code with a book within response
//else if(authorizationToken is invalid by whatever reason it's)
// return 401 code within a response
//else if(database error)
// return 500 code within a response

}

正如您在每个 jax-rs 方法中看到的,我需要使用相同的代码行:检查 token ,将其转换为 User对象,如果无效则返回 401 错误。

实际上我可以通过在静态方法中提取它来优化它,该方法将执行此检查并返回 User成功时反对或抛出 Exception如果出了问题。我也可以创建 webfilter它将在到达 jax-rs 方法之前检查 header 并验证 token ,如果它无效,它将以 401 异常中止它。

但我想一起实现。 Webfilter这将验证 JWT token 以及它是否有效 转换它User对象和 注入(inject) 在 jax-rs 方法中如下:
@GET
public Response getBook(@RequestByUser User user, @QueryParam("id") String bookId) {

//if(get required book from database was successfull)
// return 200 code with a book within response
//else(database error)
// return 500 code within a response
}

因此,如果我达到了这一点,我可以确定 User 是有效的,我不需要关心它。是否有可能通过 来实现? JAX-RS 1.1 ?

最佳答案

我不知道有一种方法可以在这里做你想要的,但是用一些 thread local data 来实现一些东西不会太难。 .基本上,过滤器会将 ThreadLocal 数据与用户信息一起存储,并且服务方法将能够获取它。这有点像黑客,但它可以让你做你想做的事。

不过要小心 - 线程本地数据与线程一起存在 - 尽量不要在其中存储巨大的对象,否则如果您有大量客户端,您可能会遇到内存问题。

编辑

想了想,为什么不直接使用 session 呢? ThreadLocal 假设过滤器和服务在同一个线程上运行。这可能是真的,但不能保证。

所以在你的过滤器中:

JWTFilter.java

@WebFilter(urlPatterns={"/*"}
public class JWTFilter implements Filter {
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;

String jwt = req.getHeader("Authorization");
User user = getUserFromJWT(jwt); // you'll have to code this
if(user != null) {
req.getSession().setAttribute("user", user);
chain.doFilter(request, response);
}
else {
HttpServletResponse resp = (HttpServletResponse)response;
resp.sendError(HttpServletResponse.SC_FORBIDDEN);
}
}
}

你的服务.java
@GET
public Response getBook(@QueryParam("id") String bookId,
@Context HttpServletRequest request) {
User user = (User)request.getSession().getAttribute("user");
}

注意这里的“作弊”——我们正在注入(inject) HttpServletRequest 以便我们可以获取 session 以及用户。但是由于过滤器,如果 JWT 验证失败,则不会调用此方法。

此代码不利用 JAX-RS 和/或 Servlet 规范之外的任何内容,并且应该与应用服务器无关。

关于servlets - 带有安全过滤器和依赖注入(inject)的 jax-rs 1.1,如何实现这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37533743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com