Search code examples
grailsexceptionauthorizationservlet-filtersbefore-filter

Does Grails allow Declarative Exception Handling with Filters?


I'd like to create an AuthorizationFilter in my Grails app that will inspect request parameters and determine whether a user is authorized to proceed with a request. I was hoping I could throw a custom exception from within my AuthorizationFilter and later handle it with Grails declarative execption handling via a route like:

"403"(controller: 'error', action: 'status403', exception:AuthException)

... but turns out when I try this in grails 2.2.4 (and the latest dev snapshot) I get

java.lang.IllegalArgumentException: Method name must not be null
    at grails.plugin.cache.web.ProxyAwareMixedGrailsControllerHelper.retrieveAction(ProxyAwareMixedGrailsControllerHelper.java:41)

So... is there any good way to use declarative exception handling together with filters?


Solution

  • I guess you can handle declarative exception from Controllers but Filters. You can use response instead to send the error code

    class AuthorizationFilters {
        def filters = {
            auth(controller: 'error', invert: true) {
                before = {
                    if(1){ //If auth fails
                        response.sendError(403)
                        //render(status: 403) //or
                        //redirect(controller: 'error', action: 'status403') //or
                    }
                    return false
                }
            }
        }
    }
    

    Above logic will render the response from ErrorController's status403 action based on the UrlMapping that is provided in the question

    Make sure you are excluding error controller from filters.