scanE
scanE

Reputation: 342

Spring security core plugin: Different home page for user depending upon its Role

I have integrated Spring security core plugin in my Grails application.

grails.plugins.springsecurity.successHandler.defaultTargetUrl = "/user/home"

This is what I have done to set default home page after successful login. But I would like to have different home page depending upon user roles

Currently I have 2 user roles 1)"ROLE_ADMIN" 2)"ROLE_USER"

How would I implement this?

Upvotes: 0

Views: 2320

Answers (2)

Burt Beckwith
Burt Beckwith

Reputation: 75671

One quick way would be to do the logic in the controller action. For example, the home action could render a different view based on role, e.g.:

import grails.plugin.springsecurity.annotation.Secured

class UserController {
   def home() {
      String view
      if (SpringSecurityUtils.ifAllGranted('ROLE_ADMIN')) {
         view = 'admin'
      }
      else if (SpringSecurityUtils.ifAllGranted('ROLE_USER')) {
         view = 'user'
      }
      else {
         // ???
      }

      render view: view, model: [...]
   }
}

If you want to distribute the logic among different controllers, you could redirect based on role:

import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils

class UserController {
   def home() {
      if (SpringSecurityUtils.ifAllGranted('ROLE_ADMIN')) {
         redirect controller: '...', action: '...'
         return
      }
      if (SpringSecurityUtils.ifAllGranted('ROLE_USER')) {
         redirect controller: '...', action: '...'
         return
      }
      // ???
   }
}

Upvotes: 6

Sudhir N
Sudhir N

Reputation: 4096

You can configure an authentication success handler too which will redirect users to specific controllers based on the roles.

class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
    LinkGenerator linkGenerator
    private static final ADMIN_ROLE = 'ROLE_Admin'


    @Override
    protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) {
        if(SpringSecurityUtils.ifAllGranted(ADMIN_ROLE)) {
            return linkGenerator.link(controller: 'admin', action: "index")
        }

        return super.determineTargetUrl(request, response);
    }

}

See Spring Security Core : Redirect users to different screen based on role

Upvotes: 0

Related Questions