Shiro AOP与GUICE无法正常工作

时间:2014-09-23 08:41:10

标签: aop guice shiro guice-servlet

我正在写一项服务,其中我使用Shiro来保证安全。我也把Guice加入其中。我在GuiceServletContextListener

中创建了GUICE注入器
//Custom Shiro Web module with defined REALM
new MyShiroWebModule(this.servletContext, "/v1/*"),

//Shiro annotations
new MyAOPModule(),

我还在JerseyServletModule中绑定Guice容器和GuiceShiroFilter:

serve("/v1/*").with(GuiceContainer.class, params);                  
//Adds Shiro filtering  
MyShiroWebModule.bindGuiceFilter(binder());

但是来自Shiro的Annotations似乎不起作用!

我在MyShiroWebModule中配置链:

addFilterChain("/v1/res/test", ANON);
addFilterChain("/v1/**", ROLES, AUTHC_BASIC);

所以,如果我使用" ROLES"过滤然后它以AOP方式扫描角色:

@RolesAllowed("SomeFancyRole")(参见编辑)

但我想利用GUICE Shiro AOP功能。我尝试过基础ShiroAOPModule而不是我自己的 - >我的调试是为了查看配置是否被调用。

@User, @Authenticated etc.

如何合并此功能,因为文档说明只有"添加" ShiroAOPModule应该开箱即用吗? 提前谢谢

编辑:

事实证明,@RolesAllowed正在运作,感谢您添加:

params.put(PackagesResourceConfig.PROPERTY_RESOURCE_FILTER_FACTORIES, "com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory");

JerseyServletModule中的

serve("/v1/*").with(GuiceContainer.class, params);

所以来自Shiro的AOP仍未被过滤。

1 个答案:

答案 0 :(得分:0)

您可以为标准ShiroAopModule类更改它。它必须在您的ShiroWebModule子类之后初始化。 这是使ServletModule与Jersey 1.18.1,Guice 3和Apache Shiro 1.2.3一起使用的片段

public class BootstrapServletModule extends ServletModule{

private static final String propertyPackages= GenericBootstrapConstants.JERSEY_PROPERTY_PACKAGES;

@Override
protected void configureServlets() {
    super.configureServlets();

    //get the bootstrapping Properties file
    install(new BootstrapPropertiesModule());

    //Initialize Persistence JPA Unit of Work if present
    //install(new MyUnitOfWorkModule());
    //Initialize Apache Shiro if present
    install(new BootstrapShiroModule(getServletContext()));
    //This allows Shiro AOP Annotations http://shiro.apache.org/java-authorization-guide.html
    install(new ShiroAnnotationsModule());

    Map<String, String> params = new HashMap<String, String>();
    params.put(PackagesResourceConfig.PROPERTY_PACKAGES, propertyPackages);
    //if you had a Persistence Service like JPA Unit of Work you would need to add this PersistFilter also.
    //filter("/*").through(PersistFilter.class);
    //if you had a ShiroWebModule installed above you would need to add this GuiceShiroFilter also.
    filter("/*").through(GuiceShiroFilter.class);
    serve("/rest/*").with(GuiceContainer.class, params);

}
}

此致