在 spring 安全标签中启用 CORS

Posted

技术标签:

【中文标题】在 spring 安全标签中启用 CORS【英文标题】:Enabling CORS in spring security label 【发布时间】:2018-11-08 09:55:14 【问题描述】:

如何在 Spring Security 标签中启用 CORS,即在令牌 url 中。我正在使用 spring security 3.1 和 spring mvc 4.3.12。我已成功生成一个令牌以保护 API,但无法在令牌 url 中启用 CORS。 我已使用以下代码生成访问令牌

spring-security.xml

<http pattern="/oauth/token" create-session="stateless"  
          authentication-manager-ref="clientAuthenticationManager"  
          xmlns="http://www.springframework.org/schema/security">  
        <intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY" />  
        <anonymous enabled="false" />  
        <http-basic entry-point-ref="clientAuthenticationEntryPoint" />  
        <!-- include this only if you need to authenticate clients via request   
        parameters -->  
        <custom-filter ref="clientCredentialsTokenEndpointFilter"  
                       after="BASIC_AUTH_FILTER" />  
        <access-denied-handler ref="oauthAccessDeniedHandler" />  
    </http>  

这就是我启用 CORS 但不起作用的方式

dispatcher-servlet.xml

<mvc:cors>
        <mvc:mapping path="/oauth/token" allowed-origins="http://localhost:4200"
                     allowed-methods="GET" allowed-headers="Access-Control-Allow-Origin" />
    </mvc:cors>

这是我得到的错误

login:1 加载失败 http://localhost:8080/M.S.-Handloom-Fabrics/oauth/token?grant_type=password&client_id=restapp&client_secret=restapp&username=nishan&password=nishan: 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:4200” 使用权。响应的 HTTP 状态代码为 400。

【问题讨论】:

【参考方案1】:

对于此错误,您必须创建如下所示的新类。 private String corsFilter="*"; 当你提供 * 它将允许一切。希望对你有所帮助。

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter 

    private String corsFilter="*";

    public CorsFilter() 
    

    @Override
    public void doFilter(final ServletRequest req, final ServletResponse res,
            final FilterChain chain) throws IOException, ServletException 

        final HttpServletResponse response = (HttpServletResponse) res;
        final HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", corsFilter);
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods",
                "POST,  GET, PUT, OPTIONS, PATCH ,DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", " Content-Type, Authorization");

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

    @Override
    public void init(final FilterConfig filterConfig) 
    

    @Override
    public void destroy() 
    

【讨论】:

Filter 类需要导入哪个类 导入 javax.servlet.Filter;。如果我的回答有帮助,请接受此回答 我不能使用 XML @jai 做到这一点

以上是关于在 spring 安全标签中启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

Spring 安全标签在错误页面中不起作用

使用spring boot(安全)和keycloak启用角色身份验证?

如何在 Spring Security 中启用 POST、PUT 和 DELETE 方法

启用具有 JWT 安全性的 Spring Boot 2.0 执行器端点

Spring Security - 我如何启用方法安全注释?

启用安全性的 Spring Boot 1.4 测试?