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

最近在又开始写代码了,在做 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

发表评论

目前评论:1