Spring Security 注解AuthenticationPrincipal 失效排查

10 篇文章 0 订阅

#背景
项目使用了springframework.security

接口入参使用了springframework.security 注解 @AuthenticationPrincipal

 /**
     * 获得个人资料
     */
    @PostMapping(value = "/getUserPersonalInfo", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @PermissionCheck(value = "ROLE_USER")
    public String getUserPersonalInfo(@AuthenticationPrincipal Principal principal){
        String username = principal.getName();
        try {
            DataMap data = userService.getUserPersonalInfoByUsername(username);
            return JsonResult.build(data).toJSON();
        } catch (Exception e){
            log.error("[{}] get user personal info exception", username, e);
        }
        return JsonResult.fail(CodeType.SERVER_EXCEPTION).toJSON();
    }

注解失效,前端请求接口的时候发现

Principal 为空

问题排查

这个问题不复杂, String username = principal.getName(); 报NPE

spring security 框架未处理 principal.setName() 的逻辑,具体代码位置不分析了,

一般分布式项目很少使用 security 框架,基本上都是基于jwt + redis 实现分布式登录验证,验证的逻辑放在网关里。

怎么解决

排查了 注解 @AuthenticationPrincipal 使用方法

发现一篇文件介绍 spring security 怎么获取用户的登录信息

发现了新的主键:

@CurrentSecurityContext

用法:


    /**
     * 获得个人资料
     */
    @PostMapping(value = "/getUserPersonalInfo", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @PermissionCheck(value = "ROLE_USER")
    public String getUserPersonalInfo(@CurrentSecurityContext(expression = "authentication")  Authentication authentication){
        String username =authentication.getName();
        try {
            DataMap data = userService.getUserPersonalInfoByUsername(username);
            return JsonResult.build(data).toJSON();
        } catch (Exception e){
            log.error("[{}] get user personal info exception", username, e);
        }
        return JsonResult.fail(CodeType.SERVER_EXCEPTION).toJSON();
    }

这个是经过2这个小时的排查的结果

期间 使用了简单直接的方法获取用户信息

  Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        String loginName = auth.getName();

想着如果spring security 框架没有自己处理,是不是自己写一个拦截器处理,或者是不是需要自己实现spring security 中自定义拦截器
后边发现或许是项目中的 spring security 版本升级导致,查看了maven 中的版本已经升级到了5.0

参考资料:参考资料一

参考资料二

转载于:https://www.fancv.com/article/1661265334

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值