package com.iailab.framework.security.core.context;
|
|
import com.alibaba.ttl.TransmittableThreadLocal;
|
import org.springframework.security.core.context.SecurityContext;
|
import org.springframework.security.core.context.SecurityContextHolderStrategy;
|
import org.springframework.security.core.context.SecurityContextImpl;
|
import org.springframework.util.Assert;
|
|
/**
|
* 基于 TransmittableThreadLocal 实现的 Security Context 持有者策略
|
* 目的是,避免 @Async 等异步执行时,原生 ThreadLocal 的丢失问题
|
*
|
* @author iailab
|
*/
|
public class TransmittableThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy {
|
|
/**
|
* 使用 TransmittableThreadLocal 作为上下文
|
*/
|
private static final ThreadLocal<SecurityContext> CONTEXT_HOLDER = new TransmittableThreadLocal<>();
|
|
@Override
|
public void clearContext() {
|
CONTEXT_HOLDER.remove();
|
}
|
|
@Override
|
public SecurityContext getContext() {
|
SecurityContext ctx = CONTEXT_HOLDER.get();
|
if (ctx == null) {
|
ctx = createEmptyContext();
|
CONTEXT_HOLDER.set(ctx);
|
}
|
return ctx;
|
}
|
|
@Override
|
public void setContext(SecurityContext context) {
|
Assert.notNull(context, "Only non-null SecurityContext instances are permitted");
|
CONTEXT_HOLDER.set(context);
|
}
|
|
@Override
|
public SecurityContext createEmptyContext() {
|
return new SecurityContextImpl();
|
}
|
|
}
|