一、SpringSecurity中的核心组件
在SpringSecurity中的jar分为4个,作用分别为
jar | 作用 |
---|---|
spring-security-core | SpringSecurity的核心jar包,认证和授权的核心代码都在这里面 |
spring-security-config | 如果使用Spring Security XML名称空间进行配置或Spring Security的 Java configuration支持,则需要它 |
spring-security-web | 用于Spring Security web身份验证服务和基于url的访问控制 |
spring-security-test | 测试单元 |
Authentication :认证对象 |
// 相关权限信息
Collection<? extends GrantedAuthority> getAuthorities();
// 获取当前用户的凭证
Object getCredentials();
// 获取当前用户的详情
Object getDetails();
// 当前登录的用户对象
Object getPrincipal();
// 判断当前用户的登录状态:true:登录 false:未登录
boolean isAuthenticated();
// 更新用户的认证状态
void setAuthenticated(boolean var1) throws IllegalArgumentException;
Authentication保存在哪了?
在SecurityContextHolder中获取
1.SecurityContextHolder
默认情况下,SecurityContextHolder是通过 ThreadLocal
来存储对应的信息的。也就是在一个线程中可以通过这种方式来获取当前登录的用户的相关信息。而在SecurityContext中就只提供了对Authentication对象操作的方法
SecurityContext:容器上下文
// 获取认证对象
Authentication getAuthentication();
// 设置认证对象
void setAuthentication(Authentication var1);
SecurityContextHolder:
// 获取容器上下文
public static SecurityContext getContext()
// 设置容器上下文
public static void setContext(SecurityContext context)
从而可以这样获取到当前登录人信息
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserDetails userDetails = (UserDetails) principal;
System.out.println("=========="+userDetails.getUsername());
SecurityContextHolder中可以设置自定义的存储方式
public static final String SYSTEM_PROPERTY = "spring.security.strategy";
private static String strategyName = System.getProperty("spring.security.strategy");
private static SecurityContextHolderStrategy strategy;// 源码,初始化静态方法
private static void initialize() {if (!StringUtils.hasText(strategyName)) {strategyName = "MODE_THREADLOCAL";}// 3种默认的存储方式if (strategyName.equals("MODE_THREADLOCAL")) {// 本地线程中strategy = new ThreadLocalSecurityContextHolderStrategy();} else if (strategyName.equals("MODE_INHERITABLETHREADLOCAL")) {// 父子线程中,可继承strategy = new InheritableThreadLocalSecurityContextHolderStrategy();} else if (strategyName.equals("MODE_GLOBAL")) {// 全局strategy = new GlobalSecurityContextHolderStrategy();} else {try {Class<?> clazz = Class.forName(strategyName);