We should probably start a new thread for this.  I found a couple examples
on the web that do something similar to this, to access objects from the
request/session

public class ShiroConfigurator extends ServerEndpointConfig.Configurator {

    @Override
    public void modifyHandshake(ServerEndpointConfig sec,
HandshakeRequest request, HandshakeResponse response) {

        Subject subject = SecurityUtils.getSubject();
        sec.getUserProperties().put(Subject.class.getName(), subject);

        super.modifyHandshake(sec, request, response);
    }
}


On Tue, Feb 14, 2017 at 3:55 AM, Joachim Kanbach <[email protected]> wrote:

> We're using asynchronous servlet processing in GlassFish 4.1 and we're
> faced
> with a related issue.
>
> The code basically looks like this:
>
>
> final AsyncContext aContext = servletRequest.startAsync();
>
> Runnable asyncWrapper = new Runnable()
> {
>    @Override
>    public void run()
>    {
>       try
>       {
>          // asynchronous processing here
>          [...]
>       }
>       finally
>       {
>          aContext.complete();
>       }
>    }
> }
>
> Runnable subjectAwareAsyncWrapper = subject.associateWith( asyncWrapper );
> aContext.start(subjectAwareAsyncWrapper);
>
>
> GlassFish/Grizzly uses a ThreadPool for those Runnables passed off to
> AsyncContext.start(). Upon server shutdown/application undeployment,
> several
> (up to the number of threads configured for that pool) log entries like
> this
> appear:
>
> 2017-02-14T09:36:08.029+0100|Severe: The web application [...] created a
> ThreadLocal with key of type
> [org.apache.shiro.util.ThreadContext.InheritableThreadLocalMap] (value
> [org.apache.shiro.util.ThreadContext$InheritableThreadLocalMap@18959aa])
> and
> a value of type [java.util.HashMap] (value
> [{org.apache.shiro.util.ThreadContext_SECURITY_
> MANAGER_KEY=org.apache.shiro.web.mgt.DefaultWebSecurityManager@814456,
> org.apache.shiro.util.ThreadContext_SUBJECT_KEY=org.
> apache.shiro.web.subject.support.WebDelegatingSubject@d727c0}])
> but failed to remove it when the web application was stopped. Threads are
> going to be renewed over time to try and avoid a probable memory leak.
>
> To me, it looks like this is happening:
>
> The threads spawned by the thread pool inherit Shiro's
> InheritableThreadLocals, as described by Daniel before. Then at a later
> point, the SubjectRunnable created by subject.associateWith() calls
> threadState.bind() in its run() method. The implementation of bind() of the
> associated SubjectThreadState does this:
>
> this.originalResources = ThreadContext.getResources();
>
> Since the thread at that point already has Shiro's
> InheritableThreadLocalMap
> associated with it, this is regarded as its "originalResources". And when
> SubjectRunnable calls threadState.restore() at the end of its run() method,
> SubjectThreadState restores those originalResources. So eventually all the
> threads in the thread pool will be associated with Shiro's
> InheritableThreadLocalMap, leading to the logged error.
>
> I don't know if that is standard or discouraged behaviour, but the threads
> in that ThreadPool are apparently only created on demand by GlassFish, i.e.
> not in advance on server startup. I guess that is the reason why the
> concept
> with originalResources fails here.
>
> I'm thinking of subclassing SubjectRunnable and replacing
> threadState.restore() in the run() method with threadState.clear() as a
> workaround.
>
>
>
> --
> View this message in context: http://shiro-user.582556.n2.
> nabble.com/Inheritance-of-Security-Context-causes-
> problems-in-EJB-container-tp7579859p7581499.html
> Sent from the Shiro User mailing list archive at Nabble.com.
>

Reply via email to