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).