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

avatar 2018年1月28日21:04:26 1 5,830 views

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

历史上的今天
一月
28
  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

    • avatar qq 1

      6666,好