【发布时间】:2018-02-08 02:21:41
【问题描述】:
我正在使用 GraphQL 开发一个 Spring Boot 项目。我正在使用 graphql-java-tools 和 graphql-spring-boot-starter。正如您在下面的 java 配置文件中看到的那样,我设法使用 spring security 配置安全性和会话管理。
现在“/graphql”路径是安全的(只能在请求的 http 标头中发送“基本 http 身份验证”或会话令牌 (x-auth-token) 才能访问它)。在任何 GraphQL 操作上使用“基本 http 身份验证”进行身份验证将启动一个新会话并在标头中发回新的会话令牌,并且该令牌可以进一步用于继续该会话。
如何让匿名用户访问一些保持上述行为的 GraphQL 查询/突变?
如果我将antMatchers("/graphql").authenticated() 更改为antMatchers("/graphql").permitAll() 以允许匿名访问,那么即使我尝试使用“基本http 身份验证”进行身份验证,我的自定义AuthenticationProvider 也不会再被调用。
谢谢!
这是我的配置:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AuthenticationProvider authenticationProvider;
@Override
public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) {
authenticationManagerBuilder.authenticationProvider(authenticationProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/graphql").authenticated()
.and()
.requestCache()
.requestCache(new NullRequestCache())
.and()
.httpBasic()
.and()
.headers()
.frameOptions().sameOrigin() // needed for H2 web console
.and()
.sessionManagement()
.maximumSessions(1)
.maxSessionsPreventsLogin(true)
.sessionRegistry(sessionRegistry());
}
@Bean
public SessionRegistry sessionRegistry() {
return new SessionRegistryImpl();
}
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher();
}
}
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 180)
public class HttpSessionConfig {
@Bean
public HttpSessionStrategy httpSessionStrategy() {
return new HeaderHttpSessionStrategy();
}
}
【问题讨论】:
标签: authentication spring-boot spring-security graphql graphql-java