gpt4 book ai didi

java - Spring Boot - OAuth2 - 所有请求都被禁止

转载 作者:行者123 更新时间:2023-11-30 02:21:55 31 4
gpt4 key购买 nike

我有一个 Spring Boot 应用程序,它支持使用 OAuth 的 REST(应用程序和资源服务器)。

MyApplication.java

@SpringBootApplication
@EnableResourceServer
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}

OAuthConfig.java

@Configuration
@EnableAuthorizationServer
public class OAuthConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
private TokenStore tokenStore = new InMemoryTokenStore();
@Autowired
private AuthenticationManager authenticationManager;

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer configurer) throws Exception {
configurer.authenticationManager(authenticationManager);
configurer.userDetailsService(userDetailsService);
configurer.tokenStore(tokenStore);
}

@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
.inMemory()
.withClient("app")
.secret("secret")
.accessTokenValiditySeconds(120)
.refreshTokenValiditySeconds(600)
.scopes("read", "write")
.authorizedGrantTypes("password", "refresh_token")
.resourceIds("resources");
}
}

SimpleCorsFilter.java

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCorsFilter implements Filter {
public SimpleCorsFilter() {
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, content-type");

if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}

@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void destroy() {
}
}

WebSecurityConfig.java

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/signup");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}

TestController.java

@RestController
public class TestController {
@Autowired
private PanelService testService;

@PostMapping("/test")
public Panel getTest() throws Exception {
return testService.get();
}
}

我成功地生成了 token ,并且还能够通过使用上述设置调用refresh_token来获取新 token 。问题是,无论是否传递 ouath token ,我的其余调用也会返回数据。 /test 始终返回带或不带 token 的数据。

我还在 HTTP 安全性中尝试了不同的选项。即使我使用有效的 token ,下面的代码也总是抛出 Forbidden 。

http.csrf().disable();
.authorizeRequests()
.antMatchers("/signup").permitAll()
.and()
.authorizeRequests()
.anyRequest().authenticated()
.httpBasic();

我做错了什么?

最佳答案

我回答自己的问题是为了帮助所有面临类似问题的人。

在 application.properties 文件中设置以下属性

security.oauth2.resource.filter-order=3

还在 WebSecurityConfigurerAdapter 中添加以下行来配置 HttpSecurity(我不确定这段代码是如何使其工作的 - 我仍在调查)

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
...
}

下面两个例子引用了上面的代码(引用GitHub代码)

https://medium.com/@nydiarra/secure-a-spring-boot-rest-api-with-json-web-token-reference-to-angular-integration-e57a25806c50

http://www.svlada.com/jwt-token-authentication-with-spring-boot/

关于java - Spring Boot - OAuth2 - 所有请求都被禁止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46600938/

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