CDI Support

CDI Support

Shiro Objects as Managed Beans

pax-shiro-cdi provides the following Shiro objects as application-scoped managed beans:

  • SecurityManager

  • Subject

  • Session

These beans are implemented as dynamic proxies which access the target object via SecurityUtils.getSecurityManager()pax-shiro-cdi does not itself instantiate a security manager.

Securing Methods with Shiro Annotations

Apache Shiro defines a set of annotations in package org.apache.shiro.authz.annotation which can be used to declare the required roles or permissions for invoking a given method. These annotations require a suitable enabling technology like aspects or interceptors. Apache Shiro supports Spring, Guice or AspectJ as enabling technologies. Pax Shiro adds support for CDI in full-blown Java EE applications, in web-only applications with CDI (e.g. Tomcat + Weld), or in Java SE applications with CDI.

To enable Shiro annotations with CDI, include the pax-shiro-cdi library in your application and enable the ShiroInterceptor in your beans.xml descriptor:

<beans> <interceptors> <class>org.ops4j.pax.shiro.cdi.interceptor.ShiroInterceptor</class> </interceptors> </beans>

Managed Beans and Shiro INI Files

INI files are the preferred configuration mechanism for Apache Shiro. In fact, these INI files can be regarded as a kind of poor man's bean context, defining a set of Shiro-flavoured managed beans.

In a CDI application, however, these INI-configured Shiro objects are not managed beans, as they are not instantiated by the CDI bean manager. pax-shiro-cdi lets you reference CDI managed beans from Shiro INI files, so you can inject any transitive dependencies of Shiro objects by means of CDI.

To mark a managed bean as referenceable from Shiro INI files, simply add the @ShiroIni qualifier. The bean name can be set explicitly with a @Named qualifier. Otherwise, if Bean.getBeanClass() is a bean type of the given bean, the bean name will be the simple class name of this class, with the first letter converted to lower case.

Example:

@ShiroIni public class MyPasswordMatcher extends SimpleCredentialsMatcher { @Inject private MyDependency myDependency; // body omitted }
[main] iniRealm.credentialsMatcher = $myPasswordMatcher

CDI Support for Shiro Web Applications

pax-shiro-cdi-web builds on pax-shiro-cdi and provides a CdiIniWebEnvironment. To secure your web application with Apache Shiro and CDI support from Pax Shiro, include the following in your web.xml descriptor:

<context-param> <param-name>shiroEnvironmentClass</param-name> <param-value>org.ops4j.pax.shiro.cdi.web.CdiIniWebEnvironment</param-value> </context-param> <listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <filter> <filter-name>ShiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> </filter> <filter-mapping> <filter-name>ShiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

See sample-cdi-web for an example, which should work on any Java EE 6 server (tested on JBoss AS 7.2).