【问题标题】:Spring Boot - OAuth2 - All requests are being forbiddenSpring Boot - OAuth2 - 所有请求都被禁止
【发布时间】:2018-03-17 23:26:32
【问题描述】:

我有一个 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();
    }
}

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

我还尝试了不同的 HTTP 安全选项。即使我使用了有效的令牌,下面的总是会抛出 Forbidden。

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

我做错了什么?

【问题讨论】:

    标签: java spring oauth


    【解决方案1】:

    我正在回答我自己的问题,以帮助所有面临类似问题的人。

    在 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/

    【讨论】:

    猜你喜欢
    • 2018-09-07
    • 2019-05-27
    • 2017-08-31
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多