2011-07-19 8 views
1

私はSeam 2.2.Finalを使用しており、15.3.5.1章の指示に従っています。トークンベースのRemember-me認証。Seam IdentityStoreトークンベースのrememberMeのNullpointerException

<security:identity authenticate-method="#{authenticator.authenticate}" /> 
<security:remember-me enabled="true" mode="autoLogin" cookie-max-age="604800"/> 
<security:jpa-token-store token-class="com.mydomain.AuthenticationToken" /> 
<event type="org.jboss.seam.security.notLoggedIn"> 
<action execute="#{redirect.captureCurrentView}"/> 
<action execute="#{identity.tryLogin()}"/> 
</event> 
<event type="org.jboss.seam.security.loginSuccessful"> 
<action execute="#{redirect.returnToCapturedView}"/> 
</event> 

私がログインして「remember me」をチェックすると、新しいトークンがデータベースに作成されます。また、identityStoreがinitalizedされている場合しかし、私は返すようにしようとすると、セッションがタイムアウトと、私はNullPointerExceptionが取得

Caused by: java.lang.NullPointerException 
at org.jboss.seam.security.management.IdentityManager.isUserEnabled(IdentityManager.java:130) 
at org.jboss.seam.security.RememberMe$1.execute(RememberMe.java:306) 
at org.jboss.seam.security.Identity.runAs(Identity.java:743) 
at org.jboss.seam.security.RunAsOperation.run(RunAsOperation.java:75) 

に、また、identityStoreは、この呼び出しの後にNULLです。

protected void initIdentityStore() 
{  
    // Default to JpaIdentityStore 
    if (identityStore == null) 
    { 
    identityStore = (IdentityStore) Component.getInstance(JpaIdentityStore.class, true); 
} 

私はそれは言及していない、特に場合は、私は内側に入れてよく分からないと言って、そしてどのような追加の注釈が必要とされている必要があり、この

<security:jpa-identity-store 
    user-class="com.domain.model.UserAccount" 
    role-class="com.domain.model.UserRole"/> 

のようなのIdentityStoreを設定する必要がありますか必要となる文書の中にある。

THX

EDIT:このメッセージは、彼は方法を見つけるために持っているんところ、印刷されます。 seam.core.Initクラスのfactoriesマップには含まれていません。

if (log.isTraceEnabled()) log.trace("Seam component not found: " + name); 

編集:私はcomponents.xmlでコンポーネントを「インストール」する必要があるとJpaIdentityStoreに、今までに少なくともlookupUserメソッドをオーバーライドするために持っているように[OK]を、そうです。

答えて

1

私が遭遇した問題をまとめてください。第15.3.5.1章のドキュメント必要な点の半分だけをカバーしています。

  • リメンバー・ミーは、それ自体がデフォルトで有効になっていないのIdentityStoreを、死ぬ使用のIdentityManager、を使用しています。だから<component class="org.jboss.seam.security.management.JpaIdentityStore"/>が必要です。

  • さらに、15.4.2で述べたいくつかの設定が必要です。しかし、私のユーザ名はアカウントオブジェクトの一部ではなく(アカウントオブジェクトのリストに含まれていました)、ロールはエンティティではありませんそれは変更された可能性があります)。とにかく、私は15.4.2の設定をスキップし、isUserEnabled()とgetImpliedRolesメソッドを上書きしました。

  • Identity.tryLogin()を追加する必要がありますが、tryLogin()を使用すると、LoginSuccessfulイベントが発生しないサイレントログインがトリガーされます。取得したページに戻る。

。私ははIdentity.tryLogin(呼び出し私は自分のauthenticator.tryLogin(作ら

<event type="org.jboss.seam.security.notLoggedIn"> 
<action execute="#{redirect.captureCurrentView}"/> 
<action execute="#{identity.tryLogin()}"/> 
</event> 
<event type="org.jboss.seam.security.loginSuccessful"> 
<action execute="#{redirect.returnToCapturedView}"/> 
</event> 

))、その後、私はloginSuccessfulイベントを発生。問題は今istであり、これらのイベントはすべて1行で発生し、captureCurrentViewとreturnToCapturedViewは最初のものが実行されるリダイレクトを実行しているため、サインオンページに移動します。

  • RememberMeのデフォルトの動作では、トークンが存在しない場合、ユーザーのすべてのトークンが無効になります。誰もが自分のトークンをすべて無効にするために誰かのユーザ名でクッキーを設定することができます。

if (tokenStore.validateToken(decoded.getUsername(), decoded.getValue())) 
     { 
      credentials.setUsername(decoded.getUsername()); 
      credentials.setPassword(decoded.getValue());    
     } 
     else 
     { 
      // Have we been compromised? Just in case, invalidate all authentication tokens 
      tokenStore.invalidateAll(decoded.getUsername()); 
     } 
関連する問題