我正在写一项服务,其中我使用Shiro来保证安全。我也把Guice加入其中。我在GuiceServletContextListener
:
//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");
serve("/v1/*").with(GuiceContainer.class, params);
所以来自Shiro的AOP仍未被过滤。
答案 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);
}
}
此致