Я работаю над приложением Grails, у которого есть два веб-сайта: обычный «настольный» сайт и мобильный сайт, где все презентации выполняются с помощью jQuery Mobile. Чтобы различать эти сайты, я использую контроллеры Grails по умолчанию для обычного сайта, и у меня есть собственный «мобильный» контроллер для всех мобильных страниц и действий. Плагин Grails Spring Security используется для обработки всей аутентификации и авторизации.
Все идет нормально. Но вот моя проблема. На ограниченных страницах / действиях плагин безопасности автоматически перехватывает вызов (когда пользователь не аутентифицирован должным образом) и перенаправляет на страницу входа. Однако я хочу использовать две разные страницы: одну для обычного сайта и одну для мобильного сайта. Я не могу придумать хороший способ определить, в каком «контексте» находится пользователь («контекст» - обычный или мобильный).
Мое быстрое и грязное решение: если пользователь сначала переходит на мобильную страницу без ограничений, я помещаю маркер «мобильный сеанс» в объект сеанса. В контроллере входа я ищу этот маркер и устанавливаю представление на страницу мобильного входа. Вот так:
def auth = {
def config = SpringSecurityUtils.securityConfig
if (springSecurityService.isLoggedIn()) {
redirect uri: config.successHandler.defaultTargetUrl
return
}
String view = 'auth'
if (session.mob) {
log.debug "we're in a mobile session; reset view"
view = 'mauth'
}
String postUrl = "${request.contextPath}${config.apf.filterProcessesUrl}"
render view: view, model: [postUrl: postUrl,
rememberMeParameter: config.rememberMe.parameter]
}
Это, конечно, не работает, если первая страница, на которую переходит пользователь, является страницей с ограниченным доступом.
Я надеюсь, что кто-нибудь сможет мне помочь с этим. Одно «ограничение» на решение: я не думаю, что стоит проверять пользовательский агент для определения контекста (обычный сайт будет / должен работать на любом устройстве); Я бы предпочел определять контекст на основе запроса, являющегося действием мобильного контроллера.