You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Quarkus、Hibernate Envers和Keycloak实现用户操作审计

实现方案说明

该需求完全可实现,基于标准OIDC认证流程即可做到三方安全通信,且无需在每个请求中手动携带登录用户信息,具体实现逻辑如下:

整体核心逻辑

基于OAuth2.0 + OIDC标准流程,用户身份凭证由Keycloak统一签发,前端自动携带凭证、后端自动校验解析凭证,全程无需手动传递用户参数:

  • 前端Vue通过Keycloak官方JS适配器完成登录态管理,请求后端时自动在请求头携带JWT格式的访问令牌
  • 后端Quarkus通过官方OIDC扩展自动校验令牌合法性,从令牌中解析出当前登录用户信息
  • Hibernate Envers通过自定义监听器自动获取当前登录用户,写入审计日志完成操作审计

Vue端配置(一次配置全局生效)

  • 安装Keycloak JS依赖:npm install keycloak-js
  • 项目初始化时初始化Keycloak实例,配置Keycloak服务地址、所属realm、前端Client ID,登录成功后适配器会自动缓存访问令牌、刷新令牌
  • 给全局请求库(如axios)添加请求拦截器,统一给所有后端请求添加请求头Authorization: Bearer ${keycloak.token},无需在单个请求中手动添加任何用户相关参数
  • 可配置路由守卫,未登录用户自动跳转至Keycloak登录页,无需手动处理登录态判断

Quarkus端配置

  • 引入Quarkus OIDC扩展:如果用Maven则添加quarkus-oidc依赖,Gradle同理
  • 在application.properties中添加OIDC配置:
# Keycloak Realm 地址
quarkus.oidc.auth-server-url=https://你的Keycloak地址/realms/你的Realm名称
# 后端Client ID(注意和前端的Client分开创建,后端建议用bearer-only类型的Client)
quarkus.oidc.client-id=后端服务的client-id
quarkus.oidc.credentials.secret=后端Client的密钥
quarkus.oidc.tls.verification=none # 开发环境如果是http或者自签名证书可开启,生产环境关闭
  • 接口无需额外添加用户相关参数,需要登录态的接口添加@RolesAllowed注解即可自动触发令牌校验,如需获取当前用户信息,直接注入SecurityIdentity即可获取:
@Inject
SecurityIdentity securityIdentity;

// 调用以下方法即可获取当前用户ID
String userId = securityIdentity.getPrincipal().getName();

对接Hibernate Envers实现审计

  • 自定义审计Revision实体,添加操作用户相关字段:
@Entity
@RevisionEntity(CustomRevisionListener.class)
public class CustomRevision {
    @Id
    @GeneratedValue
    @RevisionNumber
    private Long id;
    @RevisionTimestamp
    private Long timestamp;
    // 自定义操作用户ID字段
    private String operationUserId;
    // 省略getter setter
}
  • 实现自定义RevisionListener,自动注入当前登录用户:
public class CustomRevisionListener implements RevisionListener {
    @Inject
    SecurityIdentity securityIdentity;

    @Override
    public void newRevision(Object revisionEntity) {
        CustomRevision rev = (CustomRevision) revisionEntity;
        // 自动写入当前操作用户ID
        rev.setOperationUserId(securityIdentity.getPrincipal().getName());
    }
}
  • 给需要审计的业务实体添加@Audited注解,之后所有该实体的增删改操作都会自动记录操作时间、操作人、变更前后的内容,无需在业务代码中手动处理审计逻辑

内容的提问来源于stack exchange,提问作者kinzkowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:21:03