Grails4搭配Audit Logging与Spring Security无法正确记录Actor问题
问题原因及排查项
核心原因
Grails Audit Logging 4.x版本默认的用户身份解析器仅适配传统基于Session的Spring Security认证模式,你使用的无状态Spring Security Rest认证场景下,默认解析器无法正常获取当前登录用户信息,只能 fallback 到你配置的defaultActor值。
具体排查项
- 先验证认证逻辑有效性:在需要审计的业务接口中手动输出
springSecurityService.principal,确认请求携带有效token时可以正常拿到当前登录用户对象,排除Spring Security Rest本身的认证异常。 - 检查审计日志身份解析器配置:你当前没有配置自定义的
auditActorResolver,默认的DefaultAuditActorResolver不支持无状态Rest认证场景,需要自行实现适配逻辑:- 实现
AuditActorResolver接口,在getActor()方法中从SecurityContextHolder或当前请求属性中提取登录用户标识 - 将自定义实现类注册为Spring Bean,插件会自动优先使用你自定义的解析器
- 实现
- 检查过滤器链执行顺序:确认Spring Security Rest的token认证过滤器执行时机早于审计日志的触发逻辑,如果审计日志生成时还未完成token身份认证,自然无法获取到用户信息。
- 排查匿名访问配置影响:临时将
grails.plugin.springsecurity.rest.token.validation.enableAnonymousAccess改为false,测试带有效token的请求是否仍然生成默认actor,排除匿名访问兜底逻辑的影响。 - 排查异步线程场景:如果你的数据修改操作是在异步子线程中执行的,
SecurityContextHolder默认使用ThreadLocal存储认证信息,子线程无法继承父线程的认证上下文,就会使用默认actor。
内容的提问来源于stack exchange,提问作者SGT Grumpy Pants
相关产品推荐
相关产品推荐

