Spring Security 得到用户名的几种方法

avatar 2018年01月28日21:04:26 7 16470 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此
最近在又开始写代码了,在做 SpringBoot 博客权限认证登录的时候,一般可以选择 Shiro 或者 Spring Security 两个框架,博主这里选择 Spring Security。

本文介绍 Spring Security 获得用户名(登录名)的几种方法。

前台获得

  1. <div sec:authorize="isAuthenticated()">
  2.     <p>已有用户登录</p>
  3.     <p>登录的用户为:<span sec:authentication="name"></span></p>
  4.     <p>用户角色为:<span sec:authentication="principal.authorities"></span></p>
  5. </div>

这里使用了 Thymeleaf 模板,需要引入相关文档属性。
  1. <html xmlns="http://www.w3.org/1999/xhtml"
  2.       xmlns:th="http://www.thymeleaf.org"
  3.       xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">


控制器中获得


因为上面的方法,一般只能获得用户名,密码还有角色类型。

要想获得详细的用户信息,我们可以根据用户名从数据库中获得用户对象,然后再存到 Session 中。

先说如何获得授权后的用户名



方法一、SecurityContextHolder + Authentication.getName() 
  1. @GetMapping("/index")
  2. public String index() {
  3.     //如果登录了,name即用户名;如果没有登录,默认为 anonymousUser
  4.     //方法一、
  5.     Authentication auth = SecurityContextHolder.getContext().getAuthentication();
  6.     String name = auth.getName(); //主体名,即登录用户名
  7.     System.out.println(name);//saysky 或 anonymousUser
  8.     return "index";
  9. }





方法二、SecurityContextHolder + User.getUsername() 
  1. @GetMapping("/index")
  2.     public String index() {
  3.         //如果登录了,可以获得用户名 saysky,否则空指针
  4.         //方法二、
  5.         User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
  6.         String name2 = user.getUsername(); //saysky 或 空指针异常
  7.         System.out.println(name2);
  8.         return "index";
  9.     }

但我在实际运用中发现获得的Authentication为null。仔细看了下源代码发现,如果想用上面的代码获得当前用户,必须在spring

security过滤器执行中执行,否则在过滤链执行完时org.springframework.security.web.context.SecurityContextPersistenceFilter类会调用SecurityContextHolder.clearContext();

而把SecurityContextHolder清空,所以会得到null。

经过spring security认证后,security会把一个SecurityContextImpl对象存储到session中,此对象中有当前用户的各种资料。





方法三、UsernamePasswordAuthenticationToken 

这也许是一种很优雅的方法,在运行过程中,spring 将UsernamePasswordAuthenticationToken 注入到 Principal 接口中, 注意controller中方法的编写.
  1. @GetMapping("/index")
  2. public String index(Principal principal) {
  3.     //如果未登录,principal为null
  4.     //方法三、
  5.     String name3 = principal.getName();
  6.     System.out.println(name3);
  7.     return "index";
  8. }







本文地址:https://liuyanzhao.com/7196.html
  • 微信
  • 交流学习,资料分享
  • weinxin
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:1   待审核评论数:0
  1. avatar qq

    6666,好