Hi,

I needed to use the shiro in one application that already uses Guice
and as such I have implemented a solution that is not perfect, but it
works.

I have a module called ShiroModule that intercepts the annotations.

public class ShiroModule extends AbstractModule {
    @Override
    protected void configure() {
        ShiroAuthorizingMethodInterceptor interceptor = new
ShiroAuthorizingMethodInterceptor();
        bindInterceptor(any(), annotatedWith(RequiresRoles.class), interceptor);
        bindInterceptor(any(),
annotatedWith(RequiresPermissions.class), interceptor);
        bindInterceptor(any(),
annotatedWith(RequiresAuthentication.class), interceptor);
        bindInterceptor(any(), annotatedWith(RequiresUser.class), interceptor);
        bindInterceptor(any(), annotatedWith(RequiresGuest.class), interceptor);
    }
}

I believe I have copied the class ShiroAuthorizingMethodInterceptor
from shiro spring and removed two lines of code (spring dependencies)

I also created a subclass of IniShiroFilter to inject the items
created from shiro.ini

@Singleton
public class ShiroSecurityFilter extends IniShiroFilter {
    private final Injector injector;

    @Inject
    protected ShiroSecurityFilter(Injector injector) {
        this.injector = injector;
    }

    @Override
    protected Map<String, ?> applySecurityManager(Ini ini) {
        Map<String, ?> beans = super.applySecurityManager(ini);
        for (Entry<String, ?> b : beans.entrySet())
            injector.injectMembers(b.getValue());
        return beans;
    }
}

And finally, in my ServletModule I 'm doing this:

install(new ShiroModule());
filter("/*").through(ShiroSecurityFilter.class);

This was the quickest solution I found without having to think too
much, but it is not the solution I want in the future. I'd like to get
rid of shiro.ini and use a solution based only on Guice.

If anyone has better solutions, do please share them.


On Thu, Mar 3, 2011 at 5:58 AM, Mark Engel <[email protected]> wrote:
> Hello,
>
> i tried to use Apache Shiro with Google Guice in a Servlet, but the
> Dependency Injection does not work.
> When I try to access a function that is protected by shiro I get an
> error about a wrong configuration
>
> org.apache.shiro.UnavailableSecurityManagerException: No
> SecurityManager accessible to the calling code, either bound to the
> org.apache.shiro.util.ThreadContext or as a vm static singleton.  This
> is an invalid application configuration.
>
> I created an example project which uses Apache Shiro, Google Guice and
> Jersey to bootstrap an example rest api which you can find on github
> (https://github.com/mren/java-rest-boilerplate)
>
> Could you help me to get this application running with Shiro?
> This project could be shown on the website as an example on how to use
> Shiro with other IoC Containers thant Spring.
>
> What is the cleanest way to use Shiro with Guice?
>



-- 
Filipe Sousa

Reply via email to