2010-05-30 3 views
1

Этот код прибудете это вошедшего в систему пользователя, используя подключаемый модуль Spring Security (Acegi):Как сохранить Spring Security вошедшего в систему пользователя в сессии

def principalInfo = authenticateService.principal() 
def person = null 
if (principalInfo != "anonymousUser" && principalInfo.username) { 
    person = Person.findByUsername(principalInfo.username) 
} 

Я тогда хотел бы сделать:

session.user = person 

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

ответ

1

Почему вы хотите это сделать? Человек уже привязан к основному лицу, которое находится на сессии. Вызовите функцию authenticateService.userDomain() для доступа к ней.

+0

Это почти работает, но если вы доступ любое связанное с этим свойство, если это не удается, например Если я сделаю человек = authenticateService.userDomain() company = person.company Я получаю исключение LazyInitializationException. Может быть, поэтому люди использовали такой код, как я уже выше? Это где мне нужен пользовательский пользовательский сервис? Или, если вы решите решить проблему? –

+0

Вы можете использовать целеустремленный выбор, но это расточительно, если вам это нужно только для этого варианта использования. Чтобы избежать LIE, вы можете повторно присоединить экземпляр (def person = authenticateService.userDomain(); person.attach()) или перезагрузить его по id (def person = Person.get (authenticateService.userDomain(). Id)). Это предпочтительнее, если вы можете сделать это только тогда, когда знаете, что это будет необходимо - если вам просто нужны строковые, логические или числовые свойства, тогда нет необходимости повторно подключаться или перезагружаться. –

+0

person.attach() дал мне исключение NonUniqueObjectException, но def person = Person.get (authenticateService.userDomain(). Id) работает. Спасибо! –

0

Spring не устанавливает объект пользователя непосредственно в сеансе. Однако они помещают объект SPRING_SECURITY_CONTEXT в сеанс. Это содержит аутентифицированный пользователь.

Следующая whould работать в вашем GSP:

${session.SPRING_SECURITY_CONTEXT?.authentication?.authenticated} 

или просто прямо в коде контроллера. Я использую это с навигационной плагине, чтобы показать определенное меню, то:

static navigation = [ 
     group:'tabs', 
     order:10, 
     isVisible: { session.SPRING_SECURITY_CONTEXT?.authentication?.authenticated } 
    ] 

и, чтобы ответить на ваш вопрос, вы можете получить объект пользователя, как это:

session.SPRING_SECURITY_CONTEXT?.authentication?.principal? 
Смежные вопросы