0
votes

I have a Grails app and I use Spring Security Plugin and the Spring Security REST Plugin as well. Normal login works well and I get a Token in the response if my credentials are correct. Now I want to access a controller and I do pass the token in the header but I get a 403 forbidden response. The Authentication works I guess because when I change the Token I get a 401 not authorized.

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"
    }
}

urlMapping:

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")
    }
}

I appreciate any help!

2
what's your question? - ikumen
I don't understand why i get a 403 Forbidden response instead getting a "hi" from my controller. - Roen
Something about my Spring Security REST settings must be wrong. Urlmapping works, if i deactivate all the security it works. - Roen
Add this rule to application.yml: '/**/**': ['permitAll'] - IgniteCoders

2 Answers

0
votes

Well as it turns out, the urlMapping is casesensitive and while i used the right url in my request when security was disabled but the wrong one when it wasn't.

0
votes

I face this issues once and later realized i had to define my intercept url map pattern for refresh token url. So from your application .groovy file go to interceptUrlMap=[] and specify the endpoint access level. If you specified ROLE_ANONYMOUS be sure the user refreshing the token has that role, otherwise permitAll on that end point.

In actual sense, you need to specify the roles that can access that endpoint, eg: ROLE_USER, ROLE_ADMIN.....