Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to exclude specific keywords from UrlMapping in Grails?

I use the following url mapping in Grails:

"/$id"{
  controller = "user"
  action = "show"
}       

to map urls like mydomain.com/someusername

How do I attach constrains to the url mapping to exclude keywords like "login", "logout",...

I.e., mydomain.com/someusername should route to mydomain.com/user/show/someusername, mydomain.com/login should not route to mydomain.com/user/show/login.

like image 854
confile Avatar asked Jun 09 '13 12:06

confile


3 Answers

You can use contrainsts for this mapping:

"/$id"{
  controller = "user"
  action = "show"
  constraints {
    //add a validator for $id from url mapping
    id(validator: {
        return !(it in ['login', 'logout'])
    })
  }
}    
like image 89
Igor Artamonov Avatar answered Oct 03 '22 15:10

Igor Artamonov


Use a filter, and redirect from it.

class UrlMappingFilters {
    def filters = {
        filterUrlKeywords(controller: '*', action: '*') {
            def keywords = ['login', 'logout']
            before = {
                if (params.id in keywords) {
                    // redirect to start, or render error...
                    redirect(uri: '/')
                    return false
                }
            }
        }
    }
}

If you want to make it specific to a controller or action, use its name instead of the '*'.

Read more:

  • Official docs on Grails filters
  • Reference
like image 43
Elias Dorneles Avatar answered Oct 03 '22 15:10

Elias Dorneles


I have done this type of thing for REST based endpoints numerous times, and Grails is smart enough to figure out what you want. Note that ordering in the UrlMappings file may be important.

For example, you can define this:

class UrlMappings {
    static mappings = {
        "/login" { controller: 'auth', action: 'login' }
        "/logout" { controller: 'auth', action: 'logout' }
        "/$id" { controller: 'user', action: 'view' }
    }
}

Then when you hit "/login" you will go in the auth:login method, but when you hit "/userid" you will be sent to user:view:userid as expected.

like image 28
Brad Lee Avatar answered Oct 03 '22 17:10

Brad Lee