Я думаю, что вообще не рекомендуется вставлять объект пользователя в объект запроса каждый раз:
Срок действия запроса очень короткий, поэтому вам может понадобиться совершать циклические обходы кэш-памяти или, что еще хуже, к базе данных при каждом http-запросе для получения объекта, который вам может даже не понадобиться и который впоследствии будет удален без необходимости. Поэтому, если необходимо, лучше хранить весь объект в сеансе, а не только идентификатор.
Как правило, я бы предложил вам написать AuthenticationService
с методом isLoggedIn()
, который возвращает true при аутентификации пользователя, и методом getLoggedInUser()
, который возвращает этот объект.
class AuthenticationService {
def transactional = false
boolean isLoggedIn() { return session.user_id }
def getLoggedInUser() { return User.get(session.user_id) }
}
Затем вы используете Фильтр для перенаправления, если не аутентифицирован, и, возможно, Перехватчик для хранения локальной ссылки user = authenticationService.loggedInUser
. Но я также не думаю, что это лучший путь. Я предлагаю вам создать абстрактный AuthenticationAwareController
в качестве базового класса для всех ваших контроллеров в src / groovy, и там есть удобный метод, такой как user
class AuthenticationAwareController {
def authenticationService
def getUser() { return authenticationService.loggedInUser() }
}
Таким образом, позже вы можете изменить свое решение о сохранении пользователя так, как вам нравится, и вам не нужно менять код. Кроме того, вы получаете выгоду от кэшей в Hibernate, которые совместно используют уже извлеченные экземпляры пользовательских объектов между различными сеансами, поэтому обходные пути db исключаются.
Вы все равно должны проверить полученный объект пользователя на действительность или бросить AuthenticationException
в случае, если поиск не удастся. (Может быть что-то вроде AuthenticationService.getLoggedInUser(failOnError = false)
.)
Вы можете даже сделать этот Service / ControllerBase небольшим плагином для повторного использования в каждом приложении или напрямую с помощью плагина безопасности Spring ...; -)