2012-06-14 16 views
7

私はJBoss AS6で動作するアプリケーションを持っています。認証は「FORM」認証方式を使用して動作しており、ユーザーは正しくログインしています。JBoss AS 6のログインイベントのリスニング

私は、残念ながら

。ユーザーが正常にログインするたびにカスタムの作品、静的コードを呼び出すことができるようにしたいと思い、私は成功した上でコードを実行する任意のリスナー、またはフック、またはコールバックを、見つけることができませんログイン。 HttpSessionListenerには「sessionCreated」のイベントがありますが、ログインしていなくてもユーザーがページにアクセスするとすぐに呼び出されます。つまりの表示ログインフォームがイベントをトリガーします。

JBoss AS 6(またはそれに相当するもの)のドキュメントで、ユーザーが最初に正常にログインした時点でカスタムコードを実行する方法を示す人はいますか?

ありがとうございます。

+0

春は 'acegi'が成功のログインとログアウトのためのフックやイベントを提供していますが、わかりません回避策とは別にプレーンな 'JAAS'を使用した単純な解決策です。あなたが春のacegiに切り替えることができれば、それはより簡単でしょう。 –

+0

@ Rp-残念ながら、このアプリケーションスタックにはSpringはありません。SpringとJBossのEJBがよく一緒に動かない傾向があることを考えれば、私はそのパスを下回らない方がよいでしょう... – Erica

+0

私が考えることができる回避策は、 'org.apache.catalina.authenticator.FormAuthenticator'を拡張して'/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml'に登録する 'CustomFormAuthenticator'です。 Jboss AS 7では、jboss-web.xml iteselfに 'CustomAuthenticator'を登録できる' valve'コンセプトが導入されました。 –

答えて

3

セキュアなサーブレットの前にServletFilterの実装を追加できます。

各呼び出し時に、フィルタはブール値フラグnotFirstCallHttpSessionにテストします。

フラグが存在しない場合、要求はユーザーのログイン後最初のものです。指定されたジョブを呼び出して、フラグnotFirstCallを設定して、このセッションで完了したジョブをマークすることができます。

+0

これはシンプルでクロス環境に対応しており、最も重要なのは機能するので、私は受け入れられた答えとしてマークしています。しかし、JBossにはより洗練されたソリューションが組み込まれていないことは残念です。 – Erica

1

javax.servlet.http.HttpSessionBindingListenerはどうですか? オブジェクトを作成し、ユーザーが正常にログインしてユーザーのセッションに属性として追加すると、そのオブジェクトをどのように入力しますか。属性が設定されている場合

// you don't create this object until a user logs in 
User userObject = new User(); 
userObject.setUserId(); 
userObject.setLogonTime(); 
// get your request object however you normally get it 
HttpServletRequest request.getSession().setAttribute("loggedInUser", userObject); 

それはオン/オフ情報にログイン保存する(これは、ユーザーを追跡するために便利に来ることができるのvalueBoundメソッド を呼び出します:だから:オブジェクトをバインドする

public class User implements Serializable, HttpSessionBindingListener { 
private String userId; 
private Timestame logonTime; 
// any additional fields 

@Override 
public void valueBound(HttpSessionBindingEvent event) { 
// this method called when this object is attached to a session 
    log.debug("user " + this.userId + "bound to a session - user logged in"); 
// do stuff 
    } 
@Override 
    public void valueUnbound(HttpSessionBindingEvent event) { 
// this method called when user's session ends, value unbound, etc 
    log.debug("user " + this.userId + "logged off"); 
// do other stuff 
    } 

} 

dbなど)。

+1

この解決策の問題は、私はまだ2番目のコードを置く必要があるということです。ユーザーがログインするときに呼び出す必要がありますが、そのような場所はありません。ユーザーがログオンするまではオブジェクトを作成しないと言いますが、ユーザーがログオンするタイミングを決定するにはどうすればいいですか?それは、私がこの質問チケットで行くところのようなものです。 – Erica

+0

私が理解する限り、2番目のコードはサーブレットフィルタに配置する必要があります。 –

+1

@YvesMartin - サーブレットフィルタに入れると、リソースがアクセスされるたびに*実行されます。成功したログイン後の初回...または私は誤解していますか? – Erica

2

私が考えることができる回避策は、がorg.apache.catalina.authenticator.FormAuthenticator に拡張され、/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xmlに登録することです。 Jboss AS 7では、CustomAuthenticatorjboss-web.xml iteselfに登録できるバルブコンセプトを導入しました。

public class CustomFormAuthenticator extends FormAuthenticator { 
    @override 
    public boolean authenticate(Request request, Response response, LoginConfig config) throws IOException { 
     boolean authenticate = super.authenticate(request, response, config); 
     //here you might need to keep track whether your custom/static code executed once or not, 
     //just to avoid executing the same code again and again. 
     if(authenticate) { 
      int i = CustomSingleton.getInstnce().getExecuteCount(); 
      if(i <= 0) { 
       //invoke custom code. 
       //increment the count 
       CustomSingleton.getInstnce().incrementExecuteCount(); 
      } 
     } 
    } 
} 

何かのようには.. entryセクションauthenticatorsに、次の/server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml 追加でserverでこれを登録する必要があります。

<entry> 
    <key>CUSTOM-FORM</key> 
    <value>full.qaulified.CustomFormAuthenticator</value> 
</entry> 

次に、web.xmlにこのことができますCUSTOM-FORM

<login-config> 
    <auth-method>CUSTOM-FORM</auth-method> 
      <form-login-config> 
       <form-login-page>/login.html</form-login-page> 
       <form-error-page>/login-error.html</form-error-page> 
      </form-login-config> 
<login-config> 

auth-methodとして希望..

+0

私はJBoss 6.1と少し異なる問題(セッション固定)を修正しようとしていましたが、これは私が必要としていたものでした。素晴らしいです、ありがとう! –

関連する問題