1

SpringSecurity プラグインをアプリケーションに統合しています。SecUserそのために、プラグインをインストールして s2-quickstart スクリプトを実行しました。これにより、 、SecRole、およびSecUserSecRoleログイン/ログアウト コントローラーの3 つのドメイン クラスが作成されました。

既存の User ドメイン クラスがあり、それを維持したかったので、User を変更して SecUser を拡張し、User からユーザー名とパスワードの重複フィールドを削除しました。また、tablePerHierarchy falseUser と SecUser の両方のマッピング セクションに追加しました。

BootStrap で、起動時に存在する管理者ユーザーを作成しようとしています。そのために、SecRole権限が ROLE_ADMIN に設定された新しいオブジェクト adminRole を作成します。次に、新しいユーザー オブジェクトを作成し、管理者ロールが含まれているかどうかを確認します。

def springSecurityService
def init {
    def adminUser = User.findByUsername('admin') ?: new User(
        username:'admin',
        password:'adminUser',
        userType:'Admin',
        enabled:true    
    ).save(failOnError:true)

    if (!adminUser.authorities.contains(adminRole))
        SecUserSecRole.create adminUser, adminRole, true

}

私の問題は、adminUser が User または SecUser インスタンスであると宣言されているかどうかに関係なく、一時的なインスタンス例外が発生し続けることです。userType には blank:false の制約があるため、User インスタンスの作成時に userType フィールドをコメントアウトすると、null は userType の有効な設定ではないという例外が発生します。それを含めると、一時的なオブジェクトの例外が発生します:オブジェクトは保存されていない一時的なインスタンスを参照しています - フラッシュする前に一時的なインスタンスを保存します: books4africa.SecUser、したがって、すべてのユーザー検証設定に合格していることがわかります。

この状況で有効なユーザー オブジェクトが保存されない原因は何ですか?

編集

この問題の解決策は、既存の dev データベース ファイルを削除し、アプリケーションを再初期化することでした。私の推測では、db と Spring Security の間に元の db と何らかの競合があったため、新しい db でアプリを再起動すると問題が解決しました。

以下の回答はどれも正確な問題を解決していないため、この場合は受け入れませんが、助けてくれてありがとう!

4

2 に答える 2

1

私には、ドメインまたはドメインのインスタンスを作成する方法に問題があるように思われます。

あなたが言った:

SecUserを拡張するようにUserを変更し、Userからusernameとpasswordの重複するフィールドを削除しました。また、ユーザーとSecUserの両方のマッピングセクションにtablePerHierarchyfalseを追加しました。

しかし、プラグインにそれを行ったことを伝えなかったのかもしれません。ドメインクラスに関するドキュメントをご覧ください。独自のドメインを使用するには、SpringSecurityプラグインを構成する必要があります(ドキュメントには必要なすべての情報が含まれています)。したがって、たとえば、独自のユーザークラスを使用する場合。あなたはあなたの設定にこのようなものを置きます:

grails.plugins.springsecurity.userLookup.userDomainClassName = 'your.package.NameOfYourClass'

これにより、プラグインはユーザーに使用する必要のあるクラスがであることがわかりますNameOfYourClass

デフォルトのクラスを使用することが重要です。たとえば、生成されたクイックスタートは、カスタムのユーザークラスとロールクラスを適切に使用する最も簡単な方法です(すべてのプロパティを独自のクラスにコピーし、必要に応じて名前を変更するだけです)。

また、チュートリアルを見て、ユーザーとロールを適切に保存する方法を確認してください。

于 2012-04-26T16:23:37.350 に答える
1

一時インスタンスのタイプ (ユーザーまたはロール) については言及しません。管理者ロールを作成するとき、新しい管理者ユーザーにこのロールを付与する前に保存しますか? 上記のコードにはその部分がありません。

于 2012-04-26T03:21:18.143 に答える