2009-05-07 15 views
3

Tomcatでカスタム領域を作成しようとしています。私の問題は、セッションに追加されたオブジェクトがシリアライズ可能かどうかを確認するフレームワークの一部としてSessionAttributeListenerがあり、セッションが無効になっているなどの問題が発生した場合です。Tomcat:java.security.Principalの実装

org.apache.catalina.realm.GenericPrincipalは直列化できないため、PrincipalとSerializableを実装する独自のクラスを作成しようとしました。その後、私はそのため偽、ユーザーが持っている必要があり、他の役割を取得

request.isUserInRole("user") 

使用しようとした場合を除き、これは問題であると思われます。私がValveクラスのCustomPrincipalのGenericPrincipalを交換するとtrueを返します。だから私の質問は:

  1. 偽のリターンの原因は何ですか?
  2. GenericPrincipalの代わりに自分のクラスを使用するにはどうすればよいですか?
  3. これを行うことはできますか?

編集:は ちょうど明確にするために、私は実際にすでにこれを実装し、それはまた、Serializableを実装除き、CustomPrincipalのコードは、GenericPrincipalと全く同じです。

request.setUserPrincipal(new CustomPrincipal(args...)); 

ではなく、私は

request.setUserPrincipal(new GenericPrincipal(args...)); 

request.getUserPrincipal(への任意の呼び出しを行うときに)戻りますCustomPrincipal Iを:私のバルブで、私が持っているとき request.isUserInRole( "ユーザー")はfalseを返しますそのクラスを使用しています。

答えて

1

あなたは私たちにもっと文脈を与える必要があります。しかし、プリンシパルはとにかく抽象であることを意図していることに注意してください。たとえば、KerberosPrincipalはPrincipalとSerializableの両方を実装していますので、にはという方法があります。

What isUserInRole は、実装クラスにリクエストをラップして、Pricipalによって識別されたユーザーが本当にその役割にあるかどうかを確認します。だから私はまずgetUserPrincipalを呼び出して、サーブレットが現在のプリンシパルであると考えているかどうかを見ていると思います。