Я работаю над приложением Grails, которое имеет два веб-сайта: обычный «настольный» сайт и мобильный сайт, где вся презентация выполняется с использованием jQuery Mobile. Чтобы различать эти сайты, я использую стандартные контроллеры Grails для обычного сайта, и у меня есть собственный «мобильный» контроллер для всех мобильных страниц и действий. Плагин Grails Spring Security используется для обработки всего, что связано с аутентификацией и авторизацией.
Пока все хорошо. Но вот моя проблема. На запрещенных страницах / действиях плагин безопасности автоматически перехватывает вызов (когда пользователь не прошел надлежащую аутентификацию) и перенаправляет на страницу входа. Однако я хочу использовать 2 разные страницы: одну для обычного сайта и одну для мобильного сайта. Я не могу найти хороший способ определить, в каком «контексте» находится пользователь («контекст» является обычным или мобильным).
Мое решение для быстрого и грязного решения: если пользователь сначала заходит на мобильную неограниченную страницу, я помещаю маркер «мобильный сеанс» в объект сеанса. В контроллере входа я ищу этот маркер и устанавливаю вид на страницу мобильного входа. Вот так:
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]
}
Конечно, это не работает, если первая страница, на которую пользователь переходит, является страницей с ограниченным доступом.
Я надеюсь, что кто-то может помочь мне с этим. Одно «ограничение» в решении: я не думаю, что это хорошая идея - изучить пользовательский агент для определения контекста (обычный сайт будет / должен работать на любом устройстве); Я бы предпочел определить контекст на основе запроса, являющегося действием мобильного контроллера.