>>>>> Steinar Bang <[email protected]>:

>>>>> Steinar Bang <[email protected]>:
>> It looks like shiro code uses reflection to load classes by name, and
>> that can be a problem in an OSGi setting.  See eg. this stack overflow
>> answer
>> https://stackoverflow.com/a/17940090

>> I wonder if there is a way around this?  Suggestions are welcome.

> This issue seems related:
>  https://issues.apache.org/jira/browse/SHIRO-537

I tried to use the workaround mentioned in the above issue, and also in
this stackoverflow answer:
 https://stackoverflow.com/a/20654110

But it still fails.  See stack trace from karaf.log at the end.

With the workaround in place, the activate method looks like this:
    @Activate
    public void activate(BundleContext ctx) {
        BundleWiring wiring = ctx.getBundle().adapt(BundleWiring.class);
        ClassLoader bundleClassloader = wiring.getClassLoader();
        Thread current = Thread.currentThread();
        ClassLoader originalClassloader = current.getContextClassLoader();
        current.setContextClassLoader(bundleClassloader);
        try {
            IniWebEnvironment webenvironment = new IniWebEnvironment();
            webenvironment.setIni(INI_FILE);
            webenvironment.setServletContext(getServletContext());
            webenvironment.init();
            DefaultWebSecurityManager securityManager = 
(DefaultWebSecurityManager) webenvironment.getSecurityManager();
            UkelonnRealm realm = 
createRealmProgramaticallyBecauseOfShiroIniClassCastException();
            securityManager.setRealm(realm);
            setSecurityManager(securityManager);
            setFilterChainResolver(webenvironment.getFilterChainResolver());
        } finally {
            current.setContextClassLoader(originalClassloader);
        }
    }


I've debugged into the code and a BundleContext is injected, and a
BundleWiring is successfully retrieved, and the classloaders are
successfully retrieved and replaced.

It fails when the IniWebEnvironment() constructor tries to create a
WebIniSecurityManagerFactory instance using reflection.


The stack trace in karaf.log, is:
2018-11-24T11:48:41,006 | ERROR | Thread-50        | security                   
      | 171 - no.priv.bang.ukelonn.web.security - 1.0.0.SNAPSHOT | 
[no.priv.bang.ukelonn.web.security.UkelonnShiroFilter(9)] The activate method 
has thrown an exception
java.lang.NoClassDefFoundError: 
org/apache/shiro/web/config/WebIniSecurityManagerFactory
        at 
org.apache.shiro.web.env.IniWebEnvironment.<init>(IniWebEnvironment.java:60) 
~[?:?]
        at 
no.priv.bang.ukelonn.web.security.UkelonnShiroFilter.activate(UkelonnShiroFilter.java:67)
 ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
~[?:?]
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]
        at 
org.apache.felix.scr.impl.inject.BaseMethod.invokeMethod(BaseMethod.java:229) 
~[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.inject.BaseMethod.access$500(BaseMethod.java:39) 
~[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.inject.BaseMethod$Resolved.invoke(BaseMethod.java:650)
 ~[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.inject.BaseMethod.invoke(BaseMethod.java:506) 
[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.inject.ActivateMethod.invoke(ActivateMethod.java:307) 
[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.inject.ActivateMethod.invoke(ActivateMethod.java:299) 
[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:298)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:109)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:906)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:879)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:823)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:347)
 [?:?]
        at 
org.apache.felix.framework.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:247)
 [?:?]
        at 
org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:350) 
[?:?]
        at org.apache.felix.framework.Felix.getService(Felix.java:3737) [?:?]
        at 
org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:470)
 [?:?]
        at 
org.ops4j.pax.web.extender.whiteboard.internal.tracker.AbstractTracker.addingService(AbstractTracker.java:168)
 [242:org.ops4j.pax.web.pax-web-extender-whiteboard:6.0.9]
        at 
org.ops4j.pax.web.extender.whiteboard.internal.tracker.AbstractTracker.addingService(AbstractTracker.java:41)
 [242:org.ops4j.pax.web.pax-web-extender-whiteboard:6.0.9]
        at 
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)
 [?:?]
        at 
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:870)
 [?:?]
        at 
org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) 
[?:?]
        at 
org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) [?:?]
        at 
org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:901)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:990)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:838)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.fireServiceEvent(EventDispatcher.java:545)
 [?:?]
        at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4595) 
[?:?]
        at org.apache.felix.framework.Felix.registerService(Felix.java:3587) 
[?:?]
        at 
org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:348)
 [?:?]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:887)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:874)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:132)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:941)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:741)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:675)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:430)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:657)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:341)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:390) 
[179:org.apache.felix.scr:2.0.12]
        at org.apache.felix.scr.impl.Activator.access$200(Activator.java:54) 
[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:265) 
[179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:254)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(AbstractExtender.java:227)
 [179:org.apache.felix.scr:2.0.12]
        at 
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:482)
 [?:?]
        at 
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:415)
 [?:?]
        at 
org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232) [?:?]
        at 
org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:915)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:834)
 [?:?]
        at 
org.apache.felix.framework.EventDispatcher.fireBundleEvent(EventDispatcher.java:516)
 [?:?]
        at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4579) 
[?:?]
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2174) [?:?]
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998) 
[?:?]
        at 
org.apache.karaf.bundle.core.internal.BundleWatcherImpl.run(BundleWatcherImpl.java:125)
 [22:org.apache.karaf.bundle.core:4.1.5]
        at java.lang.Thread.run(Thread.java:748) [?:?]

Reply via email to