最近在又开始写代码了,在做 SpringBoot 博客权限认证登录的时候,一般可以选择 Shiro 或者 Spring Security 两个框架,博主这里选择 Spring Security。
本文介绍 Spring Security 获得用户名(登录名)的几种方法。
这里使用了 Thymeleaf 模板,需要引入相关文档属性。
因为上面的方法,一般只能获得用户名,密码还有角色类型。
要想获得详细的用户信息,我们可以根据用户名从数据库中获得用户对象,然后再存到 Session 中。
先说如何获得授权后的用户名
方法一、SecurityContextHolder + Authentication.getName()
方法二、SecurityContextHolder + User.getUsername()
但我在实际运用中发现获得的Authentication为null。仔细看了下源代码发现,如果想用上面的代码获得当前用户,必须在spring
security过滤器执行中执行,否则在过滤链执行完时org.springframework.security.web.context.SecurityContextPersistenceFilter类会调用SecurityContextHolder.clearContext();
而把SecurityContextHolder清空,所以会得到null。
经过spring security认证后,security会把一个SecurityContextImpl对象存储到session中,此对象中有当前用户的各种资料。
方法三、UsernamePasswordAuthenticationToken
这也许是一种很优雅的方法,在运行过程中,spring 将UsernamePasswordAuthenticationToken 注入到 Principal 接口中, 注意controller中方法的编写.
本文地址:https://liuyanzhao.com/7196.html
本文介绍 Spring Security 获得用户名(登录名)的几种方法。
前台获得
- <div sec:authorize="isAuthenticated()">
- <p>已有用户登录</p>
- <p>登录的用户为:<span sec:authentication="name"></span></p>
- <p>用户角色为:<span sec:authentication="principal.authorities"></span></p>
- </div>
这里使用了 Thymeleaf 模板,需要引入相关文档属性。
- <html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:th="http://www.thymeleaf.org"
- xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
控制器中获得
因为上面的方法,一般只能获得用户名,密码还有角色类型。
要想获得详细的用户信息,我们可以根据用户名从数据库中获得用户对象,然后再存到 Session 中。
先说如何获得授权后的用户名
方法一、SecurityContextHolder + Authentication.getName()
- @GetMapping("/index")
- public String index() {
- //如果登录了,name即用户名;如果没有登录,默认为 anonymousUser
- //方法一、
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- String name = auth.getName(); //主体名,即登录用户名
- System.out.println(name);//saysky 或 anonymousUser
- return "index";
- }
方法二、SecurityContextHolder + User.getUsername()
- @GetMapping("/index")
- public String index() {
- //如果登录了,可以获得用户名 saysky,否则空指针
- //方法二、
- User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- String name2 = user.getUsername(); //saysky 或 空指针异常
- System.out.println(name2);
- return "index";
- }
但我在实际运用中发现获得的Authentication为null。仔细看了下源代码发现,如果想用上面的代码获得当前用户,必须在spring
security过滤器执行中执行,否则在过滤链执行完时org.springframework.security.web.context.SecurityContextPersistenceFilter类会调用SecurityContextHolder.clearContext();
而把SecurityContextHolder清空,所以会得到null。
经过spring security认证后,security会把一个SecurityContextImpl对象存储到session中,此对象中有当前用户的各种资料。
方法三、UsernamePasswordAuthenticationToken
这也许是一种很优雅的方法,在运行过程中,spring 将UsernamePasswordAuthenticationToken 注入到 Principal 接口中, 注意controller中方法的编写.
- @GetMapping("/index")
- public String index(Principal principal) {
- //如果未登录,principal为null
- //方法三、
- String name3 = principal.getName();
- System.out.println(name3);
- return "index";
- }
本文地址:https://liuyanzhao.com/7196.html
2019年04月23日 00:46:18
6666,好