【问题标题】:CORS for oauth/token in Oauth2 of spring春季 Oauth2 中 oauth/token 的 CORS
【发布时间】:2017-01-04 10:01:45
【问题描述】:

我们尝试使用以下配置在 Spring 中实现 Oauth2:

<sec:http pattern="/oauth/token" create-session="stateless"
    authentication-manager-ref="authenticationManager">
    <sec:intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY"
        method="GET" />
    <sec:anonymous enabled="false" />
    <sec:http-basic entry-point-ref="clientAuthenticationEntryPoint" />
    <sec:custom-filter ref="clientCredentialsTokenEndpointFilter"
        before="BASIC_AUTH_FILTER" />
    <sec:access-denied-handler ref="oauthAccessDeniedHandler" />
</sec:http>

但是当我们从另一个域调用/oauth/token 时,我们得到了 403 错误。 /oauth/token如何配置CORS?

【问题讨论】:

    标签: java spring spring-security oauth


    【解决方案1】:

    将此过滤器添加到 dispatcherServlet 到 root (/*) 及以上模式:

    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.core.Ordered;
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    
    @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, PUT");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization, x-auth-token, origin, content-type, accept");
    
            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() {
        }
    }
    

    注册:

    FilterRegistration corsFilterReg = servletContext.addFilter("simpleCORSFilter", SimpleCORSFilter.class);
            corsFilterReg.addMappingForUrlPatterns(null, false, "/*");
    

    【讨论】:

    • FilterRegistration corsFilterReg = servletContext.addFilter("simpleCORSFilter", SimpleCORSFilter.class); corsFilterReg.addMappingForUrlPatterns(null, false, "/*");
    • 感谢您的支持。我们在哪里注册 SimpleCORSFilter?
    • 在公共 void onStartup(final ServletContext servletContext) 中实现 WebApplicationInitializer 的类中抛出 ServletException 方法
    • 或者如果你使用 xml 在 web.xml 中注册它,如下所示:mkyong.com/spring-mvc/…
    • 目前,我们使用传统的、基于 XML 的方法。根据您的建议,我们应该将其更改为基于代码的方法吗?
    猜你喜欢
    • 2016-01-28
    • 2016-06-29
    • 2017-06-24
    • 2015-07-25
    • 2018-09-11
    • 2015-04-17
    • 2015-07-25
    • 2015-04-11
    • 2014-08-20
    相关资源
    最近更新 更多