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

使用Quarkus rest data Panache时,如何从@Prepersisted中的请求头访问用户名

诸葛苏燕
2023-03-14
package org.acme.manrest;

import javax.enterprise.context.RequestScoped;
import javax.persistence.PrePersist;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;

import org.acme.jpa.TBusiness;
import org.jboss.logging.Logger;

@RequestScoped
public class HeaderValue {
  private static final Logger LOG = Logger.getLogger(HeaderValue.class);

  @Context
  HttpServletRequest request;

  public HttpServletRequest getRequest() {
    return request;
  }

  @Context
  HttpHeaders httpHeaders;

  @HeaderParam("x-remote-user")
  String userName;

  public String getUserName() {
    LOG.info("xxx: " + getRequest().getHeader("x-remote-user"));
    LOG.info("userName: " + userName);
    LOG.info("getUserName2: " + getUserName2());
    LOG.info("getUserName3: " + getUserName3());
    return userName;
  }

  public String getUserName2() {
    return httpHeaders.getRequestHeader("x-remote-user").get(0);
  }

  public String getUserName3() {
    LOG.info("getUserName from class " + request.getHeader("x-remote-user"));
    return request.getHeader("x-remote-user");
  }

  @PrePersist
  void onPrePersist(TBusiness myEntity) {
    LOG.info("getUserName: " + userName);

    myEntity.createdBy = userName;
    myEntity.updatedBy = userName;
  }

}

切换到JWT并在Quarkus中使用JWT RBAC可能是一种变通方法吗?

共有1个答案

茅曾琪
2023-03-14

通过添加底层依赖关系来实现这一点:

    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-undertow</artifactId>
    </dependency>

然后在PrePersist方法下面创建的EntityListener类中:

@RequestScoped
// @Path("api/v1/Header")
public class AuditingEntityListener {
  private static final Logger LOG = Logger.getLogger(AuditingEntityListener.class);

  // Inject the bean so that Quarkus does not remove it at build time (IMPORTANT)
  @Inject
  HttpServletRequest requestNotUsed;

  @PrePersist
  void onPrePersist(TBusiness myEntity) {
    HttpServletRequest HSR = CDI.current().select(HttpServletRequest.class).get();
    LOG.info("HSR getRequestHeader user: " + HSR.getHeader("x-remote-user"));
  }
}

在Quarkus中使用JWT RBAC同样有效:

  @PrePersist
  void onPrePersist(TBusiness myEntity) {
    JsonWebToken context = CDI.current().select(JsonWebToken.class).get();
    LOG.info("context: " + context.getClaim("preferred_username"));
  }
 类似资料:
  • 我想获取在GraphQl查询调用期间传递的头值。在rest api HttpServletRequest的情况下,我们可以先做一些类似的事情。getheader() 我想从dataFetching环境中获取它,但从该值获取的上下文并没有让我从请求中获取标头值。 我不打算更改解析器方法调用,但任何改进代码的输入都会很好。

  • 如何在JAX-RS中实现WriterInterceptor接口时访问请求头? 完整的代码如下:

  • 我更倾向于使用Lambda和Java8来设置,但是使用node.js的示例也有助于理解如何实现这一点。

  • 问题内容: 在执行ModelForm时,我想根据当前用户是否为超级用户执行不同类型的验证检查。如何访问当前的请求用户? 问题答案: 您可以将用户对象作为额外的参数传递给表单构造函数。 例如 构造函数将如下所示: 然后根据需要在clean_XX表单中使用user

  • 问题内容: 我想将自定义标头添加到jQuery的AJAX POST请求中。 我已经试过了: 当我发送此请求并观看FireBug时,看到以下标头: 选项xxxx / yyyy HTTP / 1.1 主机:127.0.0.1:6666 用户代理:Mozilla / 5.0(Windows NT 6.1; WOW64; rv:11.0)Gecko / 20100101 Firefox / 11.0 接受

  • 问题内容: 我的JavaScript应用程序需要确定资源的长度, 然后 才能使用Ajax下载资源。通常这不是问题,您只需发出HEAD请求并提取即可。 但是,资源存储在与客户端不同的服务器上。(我控制的服务器)。因此,我正在使用CORS发出跨域Ajax请求,并已设置服务器以使用自定义标头响应HEAD请求和GET / POST请求的预检请求。 总的来说,这很有效,但是在使用CORS时,我似乎找不到一种