3

Acegi / Spring Securityプラグインを使用してGrailsでWebアプリを作成していますが、ユーザーインスタンスに加えた変更を確認するのに問題があります。私はGroovy/Grailsを使って約3週間しか働いていません。その答えを見つけるためにメーリングリストやチュートリアルをじっくり見てきたので、この問題が些細なものである場合はご容赦ください。

反対の推奨事項が見つからなかったため、ユーザーに電子メール確認トークンや本名などの詳細情報を含める必要がある場合は常に、ユーザードメインクラスに新しい属性を追加しています。新しいユーザーを作成するにはすべて問題ないようですが、ユーザーを編集すると、変更はユーザーリストに表示されますが、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
}

このコードを実行した後、常にIDでユーザーデータを取得している場合は変更を確認できますが、Acegiタグまたは関数を使用している場合は確認できません。たとえば、これは機能しません。

loggedInUserInfo(field:'realName')

しかし、これはします:

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

新しい情報は、ログアウトして再度ログインした後に表示されることがありますが、通常は表示されず、3回以上再ログインしても表示されないことがよくあります。また、person.save()に「flush:true」を追加しても効果はありません。

(一般的な質問:このようにUserクラスをいじるのは悪いことですか?そうでない場合、それに情報を追加するための最良の方法は何ですか?)

さらに調査した後の更新: 通常のページでloggedInUserInfo()を使用すると正常に機能するように見えますが、レイアウト内で使用すると、説明した動作を示します。奇妙なキャッシングが起こっている可能性はありますか?

4

6 に答える 6

2

この問題の回避策があり、この問題のJIRAエントリも作成しました。

Acegiが内部でユーザーを更新する方法にバグがあるようです。コントローラーにアクセスするたびにユーザーの権限を手動で更新するgrailsフィルターの形式で回避策を提供します。理想的ではありませんが、機能します。

乾杯、

于 2009-11-20T11:35:16.297 に答える
2

ユーザークラスを変更した後、grails generate-managerを実行しましたか?

于 2009-05-30T18:27:50.853 に答える
1

私が正しく覚えていれば、Acegiはユーザー情報をキャッシュします。DefaultSecurityConfig' 'ファイル(config /の下にある名前だと思います)をチェックして、ユーザー情報キャッシュを無効にします。authenticateServiceでいくつかのメソッドを呼び出して(現在どのメソッドを思い出せないか)、ユーザーキャッシュを削除することもできます。

UserController#updateクロージャー内で後者を見つけることができるかもしれません。

于 2009-06-03T16:58:22.803 に答える
1

私は同じ問題に直面し、上記のMaximilianSchweitzerからのアドバイスに従いました。最初はうまくいきませんでした。

これらの手順を試して、問題が解決するかどうかを確認してください。

  1. Maximilian Schweitzerによる上記の回答に従って、generate-managerを実行しました。
  2. generate-managerを実行する前に作成されたユーザーでログインしようとしました-動作しませんでした
  3. 新しいユーザーを作成しました(新しいUserController、gspなどを使用)
  4. 新しいユーザーでログインしようとすると、問題なく動作します。
  5. 以前に作成した古いユーザーを削除して再作成しました。それはうまくいきました。

それがあなたの状況に当てはまるかどうかはわかりませんが。

HTH!

于 2009-06-04T21:46:53.267 に答える
1

私は同じ問題に直面していました。私の解決策は、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

そして今出来上がり!動作しています!

ルイス

于 2010-01-19T15:44:04.713 に答える
0

認証されたユーザーをリセットする必要があります。以下のコードはまさにそれを行います(このブログから)。

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

}
于 2010-03-10T12:20:57.850 に答える