users@jersey.java.net

[Jersey] Injecting SecurityContext without _at_Context

From: Christopher Piggott <cpiggott_at_gmail.com>
Date: Wed, 24 Aug 2011 19:09:57 -0400

A long time ago, I filed Issue 650, an enhancement request to be able
to inject a SecurityContext or UserPrincipal into a resource class.
In response, Marek Potociar created an example for me that showed me
how to do it with a static username - just as an example. That example
is here:

http://java.net/projects/jersey/sources/svn/show/trunk/jersey/samples/jersey-guice-filter

I have changed things a little so that my application now uses a
ContainerRequestFilter. This filter implements the
ContainerRequest.filter(ContainerRequest cr) method to attach a
SecurityContext to the request then return it.

So now I'm back to wondering how I can do something like below, to get
rid of @Context injections:

/* THIS FAILS because Guice/GuiceServletContainer doesn't know how to
inject SecurityContext */
@RequestScoped
public class XxxPrincipalProvider implements Provider<Principal>{
        private final SecurityContext sc;
        
        @Inject
        public XxxPrincipalProvider(SecurityContext sc) {
                this.sc = sc;
        }
        
        @Override
        public Principal get() {
                return sc.getUserPrincipal();
        }
}

or even this:

/* THIS FAILS because there is no context injection at this level, so
sc is null, resulting in an NPE */
@RequestScoped
public class OcbPrincipalProvider implements Provider<Principal>{

        @Context
        SecurityContext sc;
        
        @Inject
        public OcbPrincipalProvider() {
        }
        
        @Override
        public Principal get() {
                return sc.getUserPrincipal();
        }
}


It still seems like there must be a way to do this that I haven't put
my finger on yet.

--Chris