Grails Spring Security REST得到403禁止

Posted

技术标签:

【中文标题】Grails Spring Security REST得到403禁止【英文标题】:Grails Spring Security REST Getting 403 Forbidden 【发布时间】:2015-07-24 23:17:50 【问题描述】:

我有一个 Grails 应用程序,我也使用 Spring Security 插件和 Spring Security REST 插件。正常登录效果很好,如果我的凭据正确,我会在响应中获得一个令牌。现在我想访问一个控制器,我确实在标头中传递了令牌,但我得到了 403 禁止响应。我猜身份验证有效,因为当我更改令牌时,我得到 401 未授权。

config.groovy

// Added by the Spring Security Core plugin:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'usermanagement.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'usermanagement.UserRole'
grails.plugin.springsecurity.authority.className = 'usermanagement.Role'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
    '/':                              ['permitAll'],
    '/index':                         ['permitAll'],
    '/index.gsp':                     ['permitAll'],
    '/assets/**':                     ['permitAll'],
    '/**/js/**':                      ['permitAll'],
    '/**/css/**':                     ['permitAll'],
    '/**/images/**':                  ['permitAll'],
    '/**/favicon.ico':                ['permitAll']
]
grails.plugin.springsecurity.filterChain.chainMap = [
    '/api/**': 'JOINED_FILTERS,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter',  // Stateless chain
    '/**': 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'                                                                          // Traditional chain
]
grails.plugin.springsecurity.rest.login.active = true
grails.plugin.springsecurity.rest.login.endpointUrl = '/api/login'
grails.plugin.springsecurity.rest.login.failureStatusCode = 401
grails.plugin.springsecurity.rest.login.useJsonCredentials = true
grails.plugin.springsecurity.rest.login.usernamePropertyName = "username"
grails.plugin.springsecurity.rest.login.passwordPropertyName = "password"
grails.plugin.springsecurity.rest.logout.endpointUrl = '/api/logout'
grails.plugin.springsecurity.rest.token.validation.activated = true
grails.plugin.springsecurity.rest.token.validation.headerName = 'X-Auth-Token'
grails.plugin.springsecurity.rest.token.storage.useGorm = true
grails.plugin.springsecurity.rest.token.storage.gorm.tokenDomainClassName = 'rest.auth.AuthenticationToken'
grails.plugin.springsecurity.rest.token.storage.gorm.tokenValuePropertyName = 'tokenValue'
grails.plugin.springsecurity.rest.token.storage.gorm.usernamePropertyName = 'username'

DailyBookingRESTController.groovy

import grails.plugin.springsecurity.annotation.Secured

@Secured(['permitAll'])
class DailyBookingRESTController 

    def index()  
        render "hi"
    

url映射:

class UrlMappings 

    static mappings = 
        "/$controller/$action?/$id?(.$format)?"
            constraints 
                // apply constraints here
            
        

        "/$controller/$action?/$id?(.$format)?"()
        "/"(view:"/index")
        "500"(view:'/error')
        "/api/dailyBookings"(resources: "dailyBookingREST")
    

感谢您的帮助!

【问题讨论】:

你有什么问题? 我不明白为什么我得到的是 403 Forbidden 响应,而不是从我的控制器那里得到一个“hi”。 我的 Spring Security REST 设置一定有问题。 Urlmapping 工作,如果我停用它工作的所有安全性。 将此规则添加到application.yml'/**/**': ['permitAll'] 【参考方案1】:

事实证明,urlMapping 是区分大小写的,虽然我在禁用安全性时在请求中使用了正确的 url,但在没有禁用安全性时使用了错误的 url。

【讨论】:

【参考方案2】:

我曾经遇到过这个问题,后来意识到我必须为刷新令牌 url 定义我的拦截 url 映射模式。 因此,从您的应用程序 .groovy 文件转到 interceptUrlMap=[] 并指定端点访问级别。 如果您指定了 ROLE_ANONYMOUS,请确保刷新令牌的用户具有该角色,否则在该端点上 permitAll。

实际上,您需要指定可以访问该端点的角色,例如:ROLE_USER,ROLE_ADMIN.....

【讨论】:

以上是关于Grails Spring Security REST得到403禁止的主要内容,如果未能解决你的问题,请参考以下文章

Grails - grails-spring-security-rest - 无法从 application.yml 加载 jwt 机密

grails-spring-security-rest 插件和悲观锁定

Grails + spring-security-core:用户登录后如何分配角色?

Grails Spring Security注释问题

Grails spring-security-oauth-google:如何设置

Grails Spring Security 插件网址