Различные контроллеры входа в Grails проект с Spring Security - PullRequest
1 голос
/ 21 февраля 2012

Веб-приложение My Grails состоит из двух частей: одна для браузеров для настольных компьютеров и ноутбуков, другая для мобильных устройств, использующих jquery-mobile.Мобильная часть живет в поддереве / мобильном / *.Используя Spring Security, я хотел бы иметь разные контроллеры / представления для входа в систему, выхода из системы и т. Д. Я не нашел никаких полезных советов, исследующих эту тему в Интернете.

Единственный вариант, о котором я сейчас могу подумать, - это извлечь мобильное приложение в собственный проект Grails, который затем заставит меня извлечь общую логику в плагин Grails, который затем вынудит меня к совершенно другому разработчику.и развертывание настроено и так далее ... Я бы предпочел оставить мобильную и немобильную части в одном приложении, но не могу понять, как это сделать.

Любые предложения приветствуются ...

Ответы [ 3 ]

2 голосов
/ 22 февраля 2012

Я бы сделал один из этих двух вариантов:

  • Иметь контроллер по умолчанию, который будет перенаправлять на mobileLogin или login контроллер на основе браузера клиента (или чего-то еще)
  • Используйте один контроллер входа в систему, но настройте отображение с помощью CSS (и затем вы можете сделать перенаправление на настольные / мобильные контроллеры, если это необходимо в вашем defaultTargetUrl)
1 голос
/ 26 февраля 2012

Попробуйте еще раз ...

В последнее время я работаю над чем-то похожим. И имел те же «желания», что и вы. Вот чем я закончил.

Чтобы указать на разные экраны входа в систему, я перезаписал шаг AuthenticationEntryPoint в цепочке фильтров безопасности (Spring Security). Я использовал ту же логику, что и плагин Spring-Mobile. (На самом деле, для этого вам нужно будет установить плагин Spring-Mobile). DeviceResolver подключен этим плагином.

package com.myapp.security

import org.codehaus.groovy.grails.plugins.springsecurity.AjaxAwareAuthenticationEntryPoint
import javax.servlet.http.HttpServletRequestimport javax.servlet.http.HttpServletResponse
import org.springframework.security.core.AuthenticationException

class MyAppAuthenticationEntryPoint extends AjaxAwareAuthenticationEntryPoint {
    def mobileLoginFormUrl
    def deviceResolver

    @Override
    protected String determineUrlToUseForThisRequest(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) {
        if (deviceResolver.resolveDevice(request).isMobile())
        {
             return mobileLoginFormUrl
        }
        return super.determineUrlToUseForThisRequest(request, response, e)
    }
}

Проводной, как и в ресурсах. Groovy

authenticationEntryPoint(com.myapp.security.MyAppAuthenticationEntryPoint) {
    loginFormUrl = conf.auth.loginFormUrl
    forceHttps = conf.auth.forceHttps
    ajaxLoginFormUrl = conf.auth.ajaxLoginFormUrl
    useForward = conf.auth.useForward
    portMapper = ref('portMapper')
    portResolver = ref('portResolver')
    deviceResolver = ref('deviceResolver')
    mobileLoginFormUrl = conf.auth.mobileLoginFormUrl
}

Конфиг строк в Config.groovy

grails.plugins.springsecurity.auth.loginFormUrl = '/register'
grails.plugins.springsecurity.auth.mobileLoginFormUrl = '/mobile/login'

Я также написал свой шаг AuthenticationSuccessHandler, чтобы заставить мобильных пользователей перейти на целевую страницу мобильного устройства после входа в систему.

package com.myapp.security

import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import org.codehaus.groovy.grails.plugins.springsecurity.AjaxAwareAuthenticationSuccessHandler
import org.springframework.security.web.savedrequest.RequestCache

class MyAppAuthenticationSuccessHandler extends AjaxAwareAuthenticationSuccessHandler {
    def mobileTargetUrl
    def deviceResolver
    RequestCache requestCache

    @Override
    protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response) {
         if (isMobile(request))
         {
             return mobileTargetUrl
         }
         return super.determineTargetUrl(request, response)
    }

    @Override
    void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, org.springframework.security.core.Authentication authentication) {        
        if (isMobile(request))
        {
            // we always want to go to the mobile landing page here.
            requestCache.removeRequest(request, response);
        }
        super.onAuthenticationSuccess(request, response, authentication)
    }

    private boolean isMobile(request) {
        deviceResolver.resolveDevice(request).isMobile()
    }

    @Override
    void setRequestCache(RequestCache requestCache) {
        super.setRequestCache(requestCache)
        this.requestCache = requestCache
    }

}

Это не останавливает пользователя от перехода на немобильную страницу, но вынуждает его перейти в / mobile / index после входа в систему. Там все мои ссылки на мобильных страницах ссылаются на другие мобильные страницы.

1 голос
/ 23 февраля 2012

Вы смотрели на весенний мобильный плагин?

Позволяет вам делать что-то вроде следующего в ваших контроллерах, где вам нужно переключаться между стандартным и мобильным.

def login() {
    def view = 'login'

    withMobileDevice {
      view = 'mobile/login'
    }

    render view: view
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...