You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@geronimo.apache.org by Marco Laponder <ma...@kewill.com> on 2008/09/03 10:28:27 UTC

retrieve custom principal from custom loginmodule in servlet

Hi Everyone,

I am trying to build a custom login module where custom principals are
added to the subject. The login works as expected and on the commit I
add my specific principal object to the subject. 

So far so good, but now I need to retrieve this object In my servlet and
I was expecting to be able to retrieve it by
httpRequest.getUserPrincipal() but the principal returned is not an
instance of my custom principal. Can anyone given any tips how to find
out what I am doing incorrect or is this situation not possible at all ?


Kind regards,
Marco Laponder


Re: retrieve custom principal from custom loginmodule in servlet

Posted by David Jencks <da...@yahoo.com>.
On Sep 3, 2008, at 1:28 AM, Marco Laponder wrote:

> Hi Everyone,
>
> I am trying to build a custom login module where custom principals are
> added to the subject. The login works as expected and on the commit I
> add my specific principal object to the subject.
>
> So far so good, but now I need to retrieve this object In my servlet  
> and
> I was expecting to be able to retrieve it by
> httpRequest.getUserPrincipal() but the principal returned is not an
> instance of my custom principal. Can anyone given any tips how to find
> out what I am doing incorrect or is this situation not possible at  
> all ?

You don't say if your login configuration includes any other login  
modules.  Assuming that it does not....

The specs don't describe how to pick the "UserPrincipal" from the  
possibly numerous principals in a logged-in Subject.  Geronimo uses  
this code snippet:

         Set<? extends Principal> principals =  
subject.getPrincipals(GeronimoCallerPrincipal.class);
         if (!principals.isEmpty()) {
             context.principal = principals.iterator().next();
         } else if (!(principals =  
subject.getPrincipals(PrimaryRealmPrincipal.class)).isEmpty()) {
             context.principal = principals.iterator().next();
         } else if (!(principals =  
subject.getPrincipals(RealmPrincipal.class)).isEmpty()) {
             context.principal = principals.iterator().next();
         } else if (!(principals = subject.getPrincipals()).isEmpty()) {
             context.principal = principals.iterator().next();
         }

So, the most reliable way to get your special principal returned as  
the UserPrincipal is to have it implement the marker interface  
GeronimoCallerPrincipal, and assure it is the only principal that  
implements that interface.

Hope this helps
david jencks

>
>
>
> Kind regards,
> Marco Laponder
>