Файл Grails плагин безопасности пользовательского перенаправления


Я новичок в Groovy и Grails. Я разработал приложение, с помощью Spring Security плагин через базу данных запрашиваемую карте запроса. Мне нужно пользовательское перенаправление на домашние страницы в соответствии с ролями.

Если пользователь является ROLE_ADMIN, он будет перенаправлен на свою домашнюю страницу в views adminUser/Homepage.gsp

Если пользователь является ROLE_USER, он будет перенаправлен на свою домашнюю страницу в views User/Homepage.gsp

Я не могу получить любое пользовательское перенаправление аутентификации в соответствии с логином пользователя.

4 2

4 ответа:

Это, как я делаю это. Я изменил его для ваших нужд. Дай мне знать, если это поможет.

Внутри springsecurities LoginController в методе auth() сделайте что-то вроде этого (он получит страницу, на которой пользователь был до нажатия кнопки login):

def auth() {

    session['returnUrl'] = request.getHeader("Referer")

    def config = SpringSecurityUtils.securityConfig

    if (springSecurityService.isLoggedIn()) {
        redirect uri: config.successHandler.defaultTargetUrl
        return
    }

    String view = 'auth'
    String postUrl = "${request.contextPath}${config.apf.filterProcessesUrl}"
    render view: view, model: [postUrl: postUrl,
                               rememberMeParameter: config.rememberMe.parameter]
}

Теперь внутри src / groovy создайте обработчик успеха auth:

package packageName

import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler

import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

public class MyAuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler 
{
    @Override
    protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) 
    {
        def returnUrl = request.getSession().getAttribute('returnUrl')

        // Get current users role using springSecurityService
        // You can inject springSecurityService into this class
        // http://stackoverflow.com/questions/6467167/how-to-get-current-user-role-with-spring-security-plugin

        if (role == 'ROLE_ADMIN')
        {
            returnUrl = '/adminUser/Homepage.gsp'
        }
        else if (role == 'ROLE_USER')
        {
            returnUrl = '/User/Homepage.gsp'
        }
        else
        {
            returnUrl = 'redirect somewhere'
        }

        request.getSession().removeAttribute('returnUrl')

        return returnUrl
    }
}

Теперь в разделе conf / spring / resources.groovy создать боб, как так:

import grails.plugin.springsecurity.SpringSecurityUtils

// Place your Spring DSL code here
beans = {
    authenticationSuccessHandler(packageName.MyAuthSuccessHandler) {
        def conf = SpringSecurityUtils.securityConfig      
        requestCache = ref('requestCache')
        defaultTargetUrl = conf.successHandler.defaultTargetUrl
        alwaysUseDefaultTargetUrl = conf.successHandler.alwaysUseDefault
        targetUrlParameter = conf.successHandler.targetUrlParameter
        useReferer = conf.successHandler.useReferer
        redirectStrategy = ref('redirectStrategy')
    }
}

Тогда вы должны быть хороши, чтобы идти. Дайте мне знать, если это сработает.

import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import grails.plugin.springsecurity.SpringSecurityUtils

public class MyAuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler 
{   
    @Override
    protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) 
    {
        def returnUrl = request.getSession().getAttribute('returnUrl')

        def roles = SpringSecurityUtils.getPrincipalAuthorities()

        for (String role in roles)
        {            
            if (role.equals("ROLE_ADMIN")) {
                returnUrl = '/AdminUser/index.gsp'
            }
            else if (role.equals("ROLE_USER")) {
                returnUrl = '/User/index.gsp'
            }
            else {
                returnUrl = '/'
            }
        }

        request.getSession().removeAttribute('returnUrl')

        return returnUrl
    }
}

Вот мой рабочий код.... вместо введения зависимости я использовал SpringSecurityUtils для получения текущей роли пользователя и перенаправления ее на нужную страницу...... спасибо всем за Вашу поддержку.

@sean3838 спасибо за помощь.....

Вы должны ввести springSecurityService перед вашим методом. Кроме того, getAuthorities() должен возвращать список, так что вам придется перебирать его (это потому, что у людей может быть несколько ролей).

import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler

import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

public class MyAuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler 
{
    def springSecurityService

    @Override
    protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) 
    {
        def returnUrl = request.getSession().getAttribute('returnUrl')

        def roles = springSecurityService.getPrincipal().getAuthorities()

        for (role in roles)
        {
            if (role == 'ROLE_ADMIN')
            {
                returnUrl = '/adminUser/Homepage.gsp'
            }
            else if (role == 'ROLE_USER')
            {
                returnUrl = '/User/Homepage.gsp'
            }
        }

        request.getSession().removeAttribute('returnUrl')

        return returnUrl
    }
}

Предположим, что у вас есть такая строка в вашем BuildConfig:

    compile ":spring-security-core:2.0-RC4"

И вот такой код в вашем Бутстрэпе:

    def roleAdmin = new Role(authority:LSSRole.ROLE_ADMIN.toString()).save(failOnError: true)
    def roleFirm = new Role(authority:LSSRole.ROLE_FIRM.toString()).save(failOnError: true)
    def roleLaw = new Role(authority:LSSRole.ROLE_LAWYER.toString()).save(failOnError: true)
    def roleFin = new Role(authority:LSSRole.ROLE_FINANCE.toString()).save(failOnError: true)

С примером пользователя admin, созданного с помощью этого кода:

    UserRole.create admin, roleAdmin, true

И некоторый код, подобный этому в Config:

'/dbconsole/**':                     [LSSRole.ROLE_ADMIN.toString()],
'/secure/**':                        [LSSRole.ROLE_ADMIN.toString()],
'/payment/**':                       [LSSRole.ROLE_FIRM.toString()],
'/filing/**':                        [LSSRole.ROLE_FIRM.toString()],
'/finance/**':                       [LSSRole.ROLE_FINANCE.toString()],
'/lawyer/**':                        [LSSRole.ROLE_LAWYER.toString()],

Где LSSRole-это перечисление и некоторый код, подобный этому:

        "/" {
            controller = "dispatch"
            action = "index"
        }

В ваших url-приложениях, чтобы перенаправлять пользователей после успешного входа в систему, вы можете построить диспетчер, подобный этому, чтобы отправлять пользователей на разные целевые страницы на основе их роли:

class DispatchController {

def index() { 

    def controller = 'login'
    def action = 'auth'

    if (SpringSecurityUtils.ifAllGranted(LSSRole.ROLE_ADMIN.toString())) {
        controller = 'secure'
        action = 'index' 
    } else if (SpringSecurityUtils.ifAllGranted(LSSRole.ROLE_FINANCE.toString())) { 
        controller = 'finance'
        action = 'index' 
    } else if (SpringSecurityUtils.ifAllGranted(LSSRole.ROLE_FIRM.toString())) { 
        controller = 'filing'
        action = 'summary' 
    } else if (SpringSecurityUtils.ifAllGranted(LSSRole.ROLE_LAWYER.toString())) { 
        controller = 'lawyer'
        action = 'index' 
    } else {
        flash.message = 'Where do you think you\'re going? Nno no no'
        SecurityContextHolder.clearContext()
    }

    redirect controller:controller, action:action
}

Надеюсь, это поможет.