Grails 4审计日志异常:部分记录关联错误用户
Grails Audit Logging插件多租户环境下审计日志用户关联异常问题
使用Grails Audit Logging插件时遇到一个棘手问题:约1.5%的审计日志记录关联了错误的操作用户。系统采用多租户架构,这些错误记录中的用户属于其他组织,完全不可能执行对应操作,且问题主要出现在INSERT和UPDATE类型的日志中。
经排查,所有出现问题的操作均来自带有@Subscriber注解的方法,这类方法由调用链上层的事件发布器触发。
举个具体场景:当用户提交additionalPhoto时,事件发布器会触发compareToPhoto方法,核心代码如下:
@Publisher(Event.ADDITIONAL_PHOTO_CREATED) @Transactional(rollbackFor = Throwable.class) AdditionalPhoto create(AdditionalPhoto additionalPhoto) { additionalPhoto.expirationDate = new Date(System.currentTimeMillis() + additionalPhoto.additionalPhotoType.timeToLive) additionalPhoto.validate() if (additionalPhoto.hasErrors()) throw new InvalidResourceException(additionalPhoto.errors) deletePriorAdditionalPhotos(additionalPhoto) additionalPhoto.save() return additionalPhoto } @Transactional @Subscriber(Event.ADDITIONAL_PHOTO_CREATED) void compareToPhoto(AdditionalPhoto additionalPhoto) { compareFaces(additionalPhoto) } void compareFaces(AdditionalPhoto additionalPhoto, Photo photo = null) { log.debug("comparing faces for additionalPhoto #$additionalPhoto.id") if (!additionalPhoto.additionalPhotoType.enableFacialRecognition) return sleep(asyncDelay) photo = photo ?: additionalPhoto.person.currentPhoto additionalPhoto.facialRecognitionScore = rekognitionService.compareFaces(photoService.fetchBytes(photo), fetchBytes(additionalPhoto)) if (additionalPhoto.facialRecognitionScore == NO_FACE_DETECTED) { log.error("No face detected in either Photo #$photo.id or Additional Photo #$additionalPhoto.id for $additionalPhoto.person.email") } additionalPhoto.save() }
审计日志中记录的错误用户虽然当时确实在系统中活跃并进行其他操作,但绝对没有权限发起上述方法调用。
目前推测Hibernate可能将订阅者的操作挂载到了其他活跃会话,导致用户归属错误,但由于多数记录保存正常,调试难度极大。
希望能得到可行的解决方案,若需要更多细节可以补充说明,谢谢!
内容的提问来源于stack exchange,提问作者JonHoffman
相关产品推荐
相关产品推荐

