gpt4 book ai didi

java - Spring boot应用程序中的SecurityContext什么时候被清除?即使 api 调用完成后它也会被保留

转载 作者:行者123 更新时间:2023-12-01 18:08:47 26 4
gpt4 key购买 nike

在我的应用程序中,我们需要验证授权 header 中传递的身份验证 token 。 header clientName 和 Authorizaiton 都是必须的。如果未传递 clientName,我们只需记录“请求中缺少客户端名称”。在身份验证配置中,我们仅对写入操作应用安全性。问题是 - 如果第一次传递了正确的 clientName 和身份验证 token ,即使两个必需的 header 都丢失,下一个 api 调用也可以正常工作(从 swagger/postman 进行调用时观察到问题。预期响应 - 403:禁止)。

但是,当我 cUrl 它时,我得到了正确的禁止错误代码。当我调试它时,发现SecurityContextHolder.getContext()仍然返回最后设置的上下文。

当 header 丢失时,我还需要执行 SecurityContextHolder.getContext().setAuthentication(null) 操作吗?

下面是示例代码:

if (StringUtils.isEmpty(httpRequest.getHeader(clientName)) {
log.info("missing client information");
} else {

final String authorizationHeader = httpRequest.getHeader(HttpHeaders.AUTHORIZATION);

if (!StringUtils.isEmpty(clientName) && !StringUtils.isEmpty(authorizationHeader)) {
Matcher matcher = BEARER_TOKEN_PATTERN.matcher(authorizationHeader);
if (matcher.matches()) {

Client client = null;
try {
client = authService.load(clientName);
} catch (NotFoundException e) {
log.debug("Client not registered");
}

final String storedToken = !ObjectUtils.isEmpty(client) ? client.getClientSecret() : StringUtils.EMPTY;

if (storedToken.equals(matcher.group(2))) {
ClientAuthentication clientAuthentication = new ClientAuthentication(client, storedToken, client.getScopes());
SecurityContextHolder.getContext().setAuthentication(clientAuthentication);
}
}
}
}
}
chain.doFilter(request, response);

这是身份验证配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class AuthConfiguration extends WebSecurityConfigurerAdapter {

private final Boolean isSecurityEnabled;
@Autowired
private AuthService authService;

@Autowired
public AuthConfiguration(final MyProps props) {
isSecurityEnabled = props.getIsSecurityEnabled();
}

@Override
protected void configure(HttpSecurity http) throws Exception {

http.addFilterBefore(new MyCustomAuthenticationFilter(authService), BasicAuthenticationFilter.class);
if (isSecurityEnabled) {
http.requestCache()
.requestCache(new NullRequestCache())
.and().csrf().disable().formLogin().disable()
.authorizeRequests().antMatchers(HttpMethod.OPTIONS).permitAll()
.antMatchers(HttpMethod.POST, "/api/v*/channels/**")
.hasAnyAuthority(Scope.CHANNELS_WRITE.getDefaultScope(), Scope.ADMIN.getDefaultScope())
.antMatchers(HttpMethod.PUT, "/api/v*/channels/**")
.hasAnyAuthority(Scope.CHANNELS_WRITE.getDefaultScope(), Scope.ADMIN.getDefaultScope())
.antMatchers(HttpMethod.GET).permitAll()
.antMatchers(HttpMethod.PUT).authenticated()
.antMatchers(HttpMethod.DELETE).authenticated()
.antMatchers(HttpMethod.PATCH).authenticated()
.antMatchers(HttpMethod.POST).authenticated();
} else {
http.csrf().disable().formLogin().disable().authorizeRequests()
.antMatchers("/api/**").permitAll();
}
}
}```

最佳答案

我的猜测是这种行为通常与 session 管理有关。

由于您使用的是基于 token 的安全性,因此需要在 WebSecurityConfig 中将 session 管理显式定义为无状态,如下所示

http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)

引用this了解更多详情

关于java - Spring boot应用程序中的SecurityContext什么时候被清除?即使 api 调用完成后它也会被保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60505767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com