SpringBoot控制器中从Authentication获取用户名(无需字符串解析)
从Spring Security的User对象中直接获取用户名/邮箱(无需字符串解析)
别折腾字符串解析啦!你看到的那个长长的返回值其实是org.springframework.security.core.userdetails.User对象的toString()输出,这个类本身就提供了直接获取用户名的方法,完全不用去拆字符串。
直接这么做就行:
- 先确认你的
principal或者Authentication里的主体是User类型(它是UserDetails接口的实现类) - 直接调用
getUsername()方法,代码示例:
// 从principal获取的情况 if (principal instanceof User) { String username = ((User) principal).getUsername(); // 这里就拿到了butitoy@iyotbihagay.com } // 从Authentication获取的情况 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth.getPrincipal() instanceof User) { String username = ((User) auth.getPrincipal()).getUsername(); }
为什么这方法靠谱?因为User类的toString()只是把内部属性格式化展示用的,万一后续Spring Security调整了这个字符串的格式,你的解析逻辑就崩了。而调用类本身提供的getUsername()方法,是符合面向对象规范的做法,既安全又稳定。
如果你用了自定义的UserDetails实现类也没关系,只要实现了UserDetails接口,就必然有getUsername()方法,直接调用就行。
内容的提问来源于stack exchange,提问作者Borgy Manotoy
相关产品推荐
相关产品推荐

