如何使用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
相关产品推荐
相关产品推荐

