Authentication对象是身份认证体系中的核心对象,主要用于封装用户的身份信息、认证状态、权限凭证等核心数据,是判断 “当前访问者是谁、是否合法、拥有哪些权限” 的核心载体。
封装认证核心信息
「谁」在访问系统?(用户唯一标识,如用户名、用户 ID)
「凭什么」访问?(凭证,如密码、Token、证书、第三方授权码)
「能做什么」?(权限 / 角色,如
ROLE_ADMIN、PERMISSION_EDIT)
标识认证状态
区分 “已认证” 和 “未认证”:
未认证:
isAuthenticated() == false(如游客访问);已认证:
isAuthenticated() == true(如登录后的用户)。
作为权限控制的依据
框架或业务代码通过Authentication对象获取用户权限,判断是否允许访问某个接口 / 资源(如hasRole('ADMIN')本质是校验该对象中的权限集合)。
贯穿认证流程
从 “用户提交凭证” 到 “认证通过”,Authentication是流程的核心传递对象:
认证前:构建「未认证」的
Authentication(如封装用户名 + 密码);认证中:认证管理器(
AuthenticationManager)校验凭证,通过后生成「已认证」的Authentication;认证后:存储在安全上下文(
SecurityContext)中,供全链路(控制器、服务层、过滤器)获取。
常见实现类
不同认证场景对应不同的Authentication实现:
| 实现类 | 适用场景 |
|---|---|
UsernamePasswordAuthenticationToken | 用户名 + 密码登录(最常用) |
JwtAuthenticationToken(扩展) | JWT Token 认证 |
OAuth2AuthenticationToken | OAuth2 第三方登录(如微信、GitHub) |
AnonymousAuthenticationToken | 匿名用户(未登录访问) |
获取当前登录用户的Authentication
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();获取用户名
String userName = authentication.getName();获取用户权限
Collection<? extends GrantedAuthority> authorities = authentication.getAuthenorites();获取用户详情
UserDetails userDetails = (UserDetails)authentication.getPrincipal();自定义认证的时候
构建未认证的对象(封装用户的账号密码)
Authentication unauthenticated = new UsernamePasswordAuthenticationToken(username,password);交给认证管理器校验,返回已认证的authentication
Authentication authenticated = authenticationManager.authenticate(unauthenticated);存入安全上下文,完成登录
SecurityContextHolder.getContext().setAuthentication(authenticated);