1

Grails アプリで Acegi (AKA Spring Security) プラグインを使用しています。私はSecurityConfig.groovy行を追加しました

userName = 'email'

電子メール フィールドがユーザー名として使用されるようにします。メールフィールドを変更してオブジェクトを保存すると、たとえば

user.email = 'my_new_email@foo.com'
user.save(failOnError: true)  

保存はエラーなしで完了しますが、電子メール フィールドは実際には更新されません。私の推測では、Acegi プラグインはユーザー名フィールドの変更を禁止していると思いますが、誰かが確認できるとありがたいです。

ありがとう、ドン

4

2 に答える 2

3

acegi が使用するドメイン オブジェクトはキャッシュされます。偶然にも、私は今週同じ問題を抱えていて、昨日解決策を書きました!

要約すると、次の 2 つのオプションがあります。

SecurityConfig.groovy に cacheUsers = false を追加して、ドメイン オブジェクトのキャッシュをオフにします。

SecurityContextHolder でドメイン オブジェクトを置き換えて、ドメイン オブジェクトを更新します。

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

( GrailsUserImplのソースをチェックして、これらすべての真の値が何を意味するかを確認してください!)

于 2010-03-11T08:55:23.457 に答える
1

あなたは簡単に行うことができます:

String oldUsername = user.username
user.username='my@newusername.com'
user.save()
if(oldUsername != user.username) {
  SpringSecurityUtils.reauthenticate(user.username, null)
}
于 2012-06-27T11:55:54.607 に答える