欢迎阅读 Spring Security 实战干货 系列文章 。在前两篇咱们讲解了 基于配置 和 基于注解 来配置访问控制。今天咱们来说一下如何在接口访问中检索当前认证用户信息。
咱们先讲一下具体的场景。一般咱们在认证后访问须要认证的资源时须要获取当前认证用户的信息。好比 “查询个人我的信息”。若是你直接在接口访问时显式的传入你的 UserID 确定是不合适的。由于你认证经过后访问资源,系统是知道你是谁的。并且显式的暴露用户的检索接口也不安全。因此咱们须要一个业务中能够检索当前认证用户的工具。 接下来咱们来看看 Spring Security 是如何解决这个痛点的。html
不知道你有没有留意Spring Security 实战干货:使用 JWT 认证访问接口 中是如何实现 JWT 认证拦截器 JwtAuthenticationFilter
。当服务端对 JWT Token 认证经过后,会将认证用户的信息封装到 UsernamePasswordAuthenticationToken
中 并使用工具类放入安全上下文 SecurityContext
中,当服务端响应用户后又使用同一个工具类将 UsernamePasswordAuthenticationToken
从 SecurityContext
中 clear
掉。
咱们来简单了解 SecurityContext
具体是个什么东西。java
package org.springframework.security.core.context; import java.io.Serializable; import org.springframework.security.core.Authentication; public interface SecurityContext extends Serializable { Authentication getAuthentication(); void setAuthentication(Authentication var1); }
从源码上来看很简单就是一个 存储 Authentication
的容器。而 Authentication
是一个用户凭证接口用来做为用户认证的凭证使用,一般经常使用的实现有 认证用户 UsernamePasswordAuthenticationToken
和 匿名用户AnonymousAuthenticationToken
。其中 UsernamePasswordAuthenticationToken
包含了 UserDetails
, AnonymousAuthenticationToken
只包含了一个字符串 anonymousUser
做为匿名用户的标识。咱们经过 SecurityContext
获取上下文时须要来进行类型判断。接下来咱们来聊聊操做 SecurityContext
的工具类。spring
这个工具类就是 SecurityContextHolder
。 它提供了两个有用的方法:安全
SecurityContext
SecurityContext
SecurityContext
日常咱们经过这三个方法来操做安全上下文 SecurityContext
。你能够直接在代码中使用工具类 SecurityContextHolder
获取用户信息,像下面同样:多线程
public String getCurrentUser() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication instanceof AnonymousAuthenticationToken){ return "anonymousUser"; } UserDetails principal = (UserDetails) authentication.getPrincipal(); return principal.getUsername(); }
这里也扩展一下知识面,简单讲一下 SecurityContextHolder
是如何存储 SecurityContext
的。SecurityContextHolder
默认有三种存储 SecurityContext
的策略:工具
ThreadLocal
机制来保存每一个使用者的 SecurityContext
,缺省策略,日常咱们使用这个就好了。InheritableThreadLocal
机制来保存每一个使用者的 SecurityContext
,多用于多线程环境环境下。SecurityContext
是 Spring Security 中的一个很是重要类,今天不但介绍 SecurityContext
是什么、有什么做用,也对之前讲过的一些知识进行回顾。
也对如何使用 SecurityContextHolder
操做 SecurityContext
进行了讲解。最后也简单讲述了 SecurityContextHolder
三种存储 SecurityContext
的策略和使用场景 。但愿对你学习 Spring Security 有帮助。还请多多关注。学习
关注公众号:Felordcn 获取更多资讯
线程