首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Grails 3配置CORS

使用Grails 3配置CORS
EN

Stack Overflow用户
提问于 2016-10-06 21:35:07
回答 2查看 763关注 0票数 1

我正在尝试使用这个插件在Grails 3.1.12应用程序中启用CORS支持:https://github.com/appcela/grails3-cors-interceptor

我按照文档进行了操作,下面是我在application.groovy中的安全配置:

代码语言:javascript
复制
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
[pattern: '/',               access: ['permitAll']],
[pattern: '/error',          access: ['permitAll']],
[pattern: '/index',          access: ['permitAll']],
[pattern: '/index.gsp',      access: ['permitAll']],
[pattern: '/shutdown',       access: ['permitAll']],
[pattern: '/assets/**',      access: ['permitAll']],
[pattern: '/**/js/**',       access: ['permitAll']],
[pattern: '/**/css/**',      access: ['permitAll']],
[pattern: '/**/images/**',   access: ['permitAll']],
[pattern: '/**/favicon.ico', access: ['permitAll']],
// EDIT: block all other URL access
[pattern: '/**', access: ['denyAll'], httpMethod: 'GET'],
[pattern: '/**', access: ['denyAll'], httpMethod: 'POST'],
[pattern: '/**', access: ['denyAll'], httpMethod: 'PUT'],
[pattern: '/**', access: ['denyAll'], httpMethod: 'DELETE']
]

grails.plugin.springsecurity.filterChain.chainMap = [
[pattern: '/assets/**',      filters: 'none'],
[pattern: '/**/js/**',       filters: 'none'],
[pattern: '/**/css/**',      filters: 'none'],
[pattern: '/**/images/**',   filters: 'none'],
[pattern: '/**/favicon.ico', filters: 'none'],
[pattern: '/api/login',      filters: 'securityCorsFilter,restAuthenticationFilter'],
// see http://alvarosanchez.github.io/grails-angularjs-springsecurity-workshop/
//  [pattern: '/**',             filters: 'JOINED_FILTERS'],
[
    pattern: '/api/**',
    filters: 'JOINED_FILTERS,-anonymousAuthenticationFilter,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter'
]
]
// EDIT: Optimistic approach (restrict access by URL only) to allow 'OPTIONS' access for CORS
grails.plugin.springsecurity.rejectIfNoRule = false
grails.plugin.springsecurity.fii.rejectPublicInvocations = false

我的问题是,当我发送一个OPTIONS请求到我的任何/api/什么端点而没有提供authorization头时,我得到一个401状态,我不知道为什么。

EN

回答 2

Stack Overflow用户

发布于 2016-10-07 04:10:09

好的,我注意到了sample project的一个关键区别。我的项目在控制器级别使用RestfulController@Secured注释,这就是产生401ON选项的原因。我覆盖了所有的方法以在方法级别保护它们,现在我不再得到401。

票数 1
EN

Stack Overflow用户

发布于 2017-12-21 22:31:08

您可以尝试这个解决方案(这对我很有效,使用grails 3.1.x):

CrosFilter.java:

代码语言:javascript
复制
import org.springframework.web.filter.OncePerRequestFilter;
import javax.annotation.Priority;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Priority(Integer.MIN_VALUE)
public class CorsFilter extends OncePerRequestFilter {

    public CorsFilter() { }

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain)
            throws ServletException, IOException {

        String origin = req.getHeader("Origin");

        boolean options = "OPTIONS".equals(req.getMethod());
        if (options) {
            if (origin == null) return;
            resp.addHeader("Access-Control-Allow-Headers", "origin, authorization, accept, content-type, x-requested-with");
            resp.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
            resp.addHeader("Access-Control-Max-Age", "3600");

        }

        resp.addHeader("Access-Control-Allow-Origin", origin == null || origin.equals("null") ? "*" : origin);
        resp.addHeader("Access-Control-Allow-Credentials", "true");

        if (!options) chain.doFilter(req, resp);
    }
}

如果使用插件配置文件: src/main/groovy/pluginname/PluginNameGrailsPlugin.groovy:

代码语言:javascript
复制
 Closure doWithSpring() {
        { ->
            corsFilter(CorsFilter)
         }
}

对于web应用程序配置文件: grails-app/conf/spring/resources.groovy:

代码语言:javascript
复制
beans = {
corsFilter(CorsFilter)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39897521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档