Плагин Acegi / Spring Security Grails не видит изменений в экземпляре пользователя - PullRequest
3 голосов
/ 27 мая 2009

Я пишу веб-приложение на Grails с помощью плагина Acegi / Spring Security, и у меня возникают проблемы с его просмотром изменений, вносимых в экземпляры пользователей. Я работаю с Groovy / Grails только около трех недель, поэтому, пожалуйста, простите меня, если эта проблема тривиальна, так как я перебираю списки рассылки и учебники, пытаясь найти ответ.

Я добавляю новые атрибуты в класс домена пользователя всякий раз, когда мне нужно, чтобы пользователь содержал дополнительную информацию, такую ​​как токен подтверждения по электронной почте или настоящее имя, поскольку я не мог найти никаких рекомендаций об обратном. Кажется, все хорошо для создания новых пользователей, но когда я редактирую пользователя, изменения отображаются в списке пользователей, но библиотеки тегов Acegi и связанные с ними функции, кажется, не видят изменений.

Вот соответствующий фрагмент из UserController.update ():

def person = User.get(params.id)
//...snip error checking...

//Update user attributes
person.username = params.email
person.email = params.email
person.userRealName = params.userRealName

//Attempt to save changes
if (person.save()) {
    //If successful, redirect back to profile viewing page
    redirect action: show, id: person.id
    return
}
else {
    //Otherwise, show errors and edit again
    render view: 'edit', model: buildPersonModel(person)
    return
}

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

loggedInUserInfo(field:'realName')

Но это так:

User.get(loggedInUserInfo(field:'id').toLong()).realName

Новая информация иногда появляется после того, как я выхожу из системы и снова, но обычно это не так, часто не показывая даже после трех или более повторных регистраций. Также я попытался добавить «flush: true» в person.save () безрезультатно.

(Периферийный вопрос: не плохо ли мне возиться с классом User, подобным этому? Если нет, как лучше добавить информацию в него?)

Обновление после дополнительного расследования: Похоже, что если я использую loggedInUserInfo () на обычной странице, он работает нормально, но если я использую его внутри макета, он демонстрирует поведение, которое я описал. Может ли происходить какое-то странное кеширование?

Ответы [ 6 ]

2 голосов
/ 20 ноября 2009

У меня есть обходной путь для этой проблемы, и я также создал запись JIRA для этой проблемы.

Кажется, есть ошибка в том, как Acegi обновляет своих пользователей внутри. Я предоставляю обходной путь в виде фильтра grails, который обновляет полномочия пользователя каждый раз при обращении к контроллеру. Не идеально, но это работает.

Приветствия

2 голосов
/ 30 мая 2009

Запустили ли вы grails generate-manager после изменения класса пользователя?

1 голос
/ 19 января 2010

Я столкнулся с той же проблемой. Моим решением было обновить плагин acegi до версии 0.5.1 (acegi 0.5.1 - плагин Grails Spring Security 2.0).

Тогда я установил на / plugins / acegi-0.5.1 / grails-app / conf / DefaultSecurityConfig.groovy

cacheUsers = false

а теперь вуаля! это работает!

1010 * Луис *

1 голос
/ 05 июня 2009

Я столкнулся с той же проблемой и следовал совету Максимилиана Швейцера выше. Это не сработало для меня в начале.

Попробуйте эти шаги и посмотрите, решит ли это проблему:

  1. Я запустил Generate-Manager согласно ответу Максимилиана Швейцера.
  2. Попытка войти в систему с пользователями, созданными до того, как я запустил Generate-Manager - Не работает
  3. Я создал нового пользователя (с новым UserController, gsp и т. Д.)
  4. Попытка входа в систему с новым пользователем работает просто отлично.
  5. Удаленные старые пользователи, созданные ранее и воссозданные ими. Работало нормально.

Хотя не уверен, относится ли это к вашей ситуации.

НТН!

1 голос
/ 03 июня 2009

Acegi кеши Информация о пользователе, если я правильно помню. Проверьте файл 'DefaultSecurityConfig' (я думаю, это имя в config /), чтобы отключить кэш информации пользователя. Вы также можете вызвать некоторый метод для authenticateService (не могу вспомнить, какой метод сейчас), чтобы удалить пользовательский кеш.

Вы можете найти его в закрытии UserController#update.

0 голосов
/ 10 марта 2010

Вы должны сбросить аутентифицированного пользователя. Код ниже делает именно это (из этого блога ).

import org.springframework.security.context.SecurityContextHolder
import org.springframework.security.providers.UsernamePasswordAuthenticationToken
import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUserImpl
import org.springframework.security.GrantedAuthority
import org.springframework.security.GrantedAuthorityImpl

...

def refreshAuthenticatedUser(user) {
    GrantedAuthority[] auths = user.authorities.collect {
        new GrantedAuthorityImpl(it.authority)
    }
    def grailsUser = new GrailsUserImpl(
            user.username,
            "",
            user.enabled,
            true,
            true,
            true,
            auths,
            user)
    def authToken = new UsernamePasswordAuthenticationToken(grailsUser, '', auths)
    SecurityContextHolder.context.authentication = authToken

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...