我有一个initiated,它在ThreadLocal属性中设置一个对象,我试图了解如何/何时清除这个线程本地(ThreadLocal.remove()),以避免异常“用户上下文已经启动”。这是因为使用前面设置的值从池中检索它。
我在用Spring的网络流量。
我可以在哪里挂起这个SecurityAuthorizationContext.clean()调用?
public class SecurityAuthorizationContext
{
private static final ThreadLocal<PrivilegeHolder> userContext = new ThreadLocal<>();
private final List<String> roles;
private SecurityAuthorizationContext(List<String> roles)
{
this.roles = roles;
}
public static void create(List<String> roles)
{
if (nonNull(userContext.get()))
{
log.error("User context already initiated.");
throw new AuthorizationException("User context already initiated.");
}
PrivilegeHolder privilegeHolder = new PrivilegeHolder();
userContext.set(privilegeHolder);
// example of privileges retrieved from database by the user roles
privilegeHolder.add(INSERT);
privilegeHolder.add(DELETE);
}
public static void clean()
{
userContext.remove();
}
public static boolean hasInsertPrivilege()
{
return userContext.get().hasPrivilege(INSERT);
}
public static boolean hasDeletePrivilege()
{
return userContext.get().hasPrivilege(DELETE);
}
}public class AuthorizationFilter implements OrderedWebFilter
{
private static final String USER_ROLES = "user-roles";
@Override
public int getOrder()
{
return SecurityWebFiltersOrder.AUTHORIZATION.getOrder();
}
@Override
public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain)
{
ServerHttpRequest request = serverWebExchange.getRequest();
HttpHeaders headers = request.getHeaders();
List<String> roles = headers.get(USER_ROLES);
SecurityAuthorizationContext.create(roles);
return webFilterChain.filter(serverWebExchange);
}
}@Configuration
@EnableWebFluxSecurity
@EnableTransactionManagement
public class ApplicationConfiguration
{
@Autowired
private AuthorizationFilter authorizationFilter;
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http)
{
return http
.csrf().disable()
.authorizeExchange()
.pathMatchers("/**").permitAll()
.and()
.addFilterAt(authorizationFilter, AUTHORIZATION)
.build();
}
}更新:长话短说..。我只想从请求头中提取一些内容,并将其提供给所有堆栈,而不将其作为参数传递。
发布于 2021-11-05 11:24:53
所以,最好使用反应堆上下文而不是ThreadLocal,在这里您可以阅读到:https://projectreactor.io/docs/core/release/reference/#context
https://stackoverflow.com/questions/69827097
复制相似问题