0

私はgrailsのレガシープロジェクトに取り組んでいます。User というドメイン クラスが存在します。パスワード、ユーザー名、役割などが含まれます。

このプロジェクトでは、ロール管理に Spring Security を使用しています。資格情報の有効期限を追加したい (ユーザーにパスワードの更新を強制する)。

User クラスを変更しました。UserDetails インターフェイスを実装していません。

ただし、サーバーを起動すると、このエラーが発生します>

org.springframework.beans.factory.BeanCreationException: 'messageSource' という名前の Bean の作成中にエラーが発生しました: Bean の初期化に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException:

「transactionManager」という名前の Bean の作成中にエラーが発生しました: Bean プロパティ「sessionFactory」の設定中に、Bean「sessionFactory」への参照を解決できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException:

「sessionFactory」という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.PropertyNotFoundException:

クラス com.company.app.user.User でプロパティ accountNonExpired のセッターが見つかりませんでした

Bean を登録する必要がありますか? インターフェイスはセッター メソッドを要求しないため、このエラーは非常に紛らわしいと思います。

アップデート

さらに調査した後、次のように見える SecurityConfig.groovy に遭遇しました( AcegiSecurity Plugin ):

security {
   // see DefaultSecurityConfig.groovy for all settable/overridable properties

   active = true

   loginUserDomainClass = "User"
   authorityDomainClass = "Role"

 ....
}

私の User クラスも次のように見えます

/**
 * User domain class.
 */
class User {
   static transients = ['pass','passwordExpired','credentialsNonExpired']
   static hasMany = [authorities: Role]
   static belongsTo = Role
   /** Username */
   String username
   /** User Real Name*/
   String userRealName
   /** MD5 Password */
   String passwd
   /** enabled */
   boolean enabled

   String email
   boolean emailShow

   /** description */
   String description = ''

   /** plain password to create a MD5 password */
   String pass = '[secret]'

   static constraints = {
      username(blank: false, unique: true)
      userRealName(blank: false)
      passwd(blank: false)
      enabled()
   }

   public boolean isCredentialsNonExpired() {
         return true;
   }
}

このクラスのパスワードの有効期限が切れるかどうかを確認するメソッドを追加しました(isCredentialsNonExpired)。ログイン時にこのメソッドを実行する必要があります。今のところ、そうではありません。

だから、それが私が取るべきAcegiのアプローチのようです. 何かご意見は?Acegi が Spring Security を使用していることは私の理解ですよね?

4

1 に答える 1

3

Acegi プラグインを使用していますか、それとも直接設定していますか? Spring Security Coreプラグインを使用すると、すぐにサポートされるため、はるかに簡単になります。

User クラスにはマップされたコレクションなどの他の荷物が含まれていることが多いため、おそらく User クラスを UserDetailsS​​ervice クラスにしたくないでしょう。確かに機能しますが、単純なデータ クラスを作成する方が良い方法です。Spring Security のバージョンに応じて org.springframework.security.userdetails.User または org.springframework.security.core.userdetails.User をサブクラス化すると便利です。

accountNonExpired のゲッターを追加したようですが、永続化する場合はセッターも必要です。値を導出していて、そのフィールドをデータベースに入れたくない場合は、transients リストに追加できます。

static transients = ['accountNonExpired']
于 2010-10-05T15:12:47.987 に答える