代码之家  ›  专栏  ›  技术社区  ›  schoon

为什么我用Swagger和OIDC得到“无法从服务器错误读取”?

  •  0
  • schoon  · 技术社区  · 6 年前

    我通过调用另一个域上的MITREid服务器将OIDC添加到了一个夸张的应用程序中。我已将重定向URI设置为 http://localhost:8080/swagger-ui.html 当我授权时,我得到:

    Can't read from server. It may not have the appropriate 
    access-control-origin settings
    

    错误。

    我的web安全配置是:

    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Value("${security.activation.status}")
    private boolean securityActivationStatus;
    
    @Value("${security.user.name}")
    private String builtinUserName;
    
    @Value("${security.user.password}")
    private String builtinPassword;
    
    @Autowired
    private OAuth2RestTemplate restTemplate;
    
    
     */
    String[] apiPath = {
            "/v2/api-docs",
            "/configuration/ui",
            "/swagger-resources",
            "/configuration/security",
            "/swagger-ui.html",
            "/webjars/**"
    };
        @Override
    protected void configure(HttpSecurity http) throws Exception {
        System.out.println("securityActivationStatus=" + securityActivationStatus);
        if (!securityActivationStatus)
            http.authorizeRequests().anyRequest().permitAll();
    
        else {
            http
            .addFilterAfter(new OAuth2ClientContextFilter(), AbstractPreAuthenticatedProcessingFilter.class)
            .addFilterAfter(myFilter(), OAuth2ClientContextFilter.class)
            .httpBasic().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/openid_connect_login"))
            .and()
            .authorizeRequests()
            .antMatchers(apiPath).permitAll()
            .antMatchers("/v1/**").authenticated();
        }
    
    
    
    
        http.csrf().disable();
        http.headers().frameOptions().disable();
    }
    
    @Bean
    public OpenIdConnectFilter myFilter() {
    
        final OpenIdConnectFilter filter = new OpenIdConnectFilter("/openid_connect_login");
        filter.setRestTemplate(restTemplate);
        return filter;
    }
    

    POM包括:

    <properties>
            <springfox.version>2.7.0</springfox.version>
            <swagger.version>1.5.17</swagger.version>
            <swagger2markup.version>1.3.1</swagger2markup.version>
            <!-- For CheckStyle -->
            <linkXRef>false</linkXRef>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <spring-security-oauth2.version>2.2.1.RELEASE</spring-security-oauth2.version>
            <spring-security-jwt.version>1.0.9.RELEASE</spring-security-jwt.version>
            <jwks-rsa.version>0.3.0</jwks-rsa.version>
            <mitreid-connect-version>1.3.1</mitreid-connect-version>
        </properties>
    

    从我的研究来看,这可能与CORS有关。这听起来像是一个可能的问题还是我的代码可能遗漏了什么?如果是CORS,你能告诉我怎么分类吗?我完全不想大摇大摆。

    0 回复  |  直到 6 年前
        1
  •  0
  •   Djamel Kr    6 年前

    启用cors:

    @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class CorsFilter implements Filter {
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        final HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
        if (HttpMethod.OPTIONS.name().equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }
    
    @Override
    public void destroy() {
    }
    
    @Override
    public void init(FilterConfig config) throws ServletException {
    }
    }
    
        2
  •  0
  •   schoon    6 年前

    如果对某人有帮助,答案是 /openid_connect_login 是错误的uri。