Попробуйте еще раз ...
В последнее время я работаю над чем-то похожим. И имел те же «желания», что и вы. Вот чем я закончил.
Чтобы указать на разные экраны входа в систему, я перезаписал шаг 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 после входа в систему. Там все мои ссылки на мобильных страницах ссылаются на другие мобильные страницы.