Quickstart Apache Shiro with Spring
Apache Shiro is an Authentication Authorization framework with support for cryptography and session management. You can quickly create a layer of security around your application.
I used this framework with couple of project and now it's my first go for authentication and authorization mechanism around any application, even over Spring Security. A lot of may like Spring Security because it comes with your spring and lot of community support and documentations.
You need to create a realm that provides all the logic of Authenticating a User and Authorizing it for any access. Below is a simple realm class. (Not doing any verification, just for demonstration)
Shiro Dependency
<!-- shiro dependency --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.1.0</version> </dependency>
Realm
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.CredentialsMatcher;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
public class MyRealm extends AuthorizingRealm {
public MyRealm() {
super();
setCredentialsMatcher(new CredentialsMatcher() {
@Override
public boolean doCredentialsMatch(AuthenticationToken arg0,
AuthenticationInfo arg1) {
System.out
.println("MyRealm.MyRealm().new CredentialsMatcher() {...}.doCredentialsMatch()");
return true;
}
});
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
System.out.println("MyRealm.doGetAuthorizationInfo()");
AuthorizationInfo info=new SimpleAuthorizationInfo();
return info;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken arg0) throws AuthenticationException {
System.out.println("MyRealm.doGetAuthenticationInfo()");
UsernamePasswordToken token=(UsernamePasswordToken) arg0;
AuthenticationInfo info=new SimpleAuthenticationInfo(1,token.getCredentials(), getName());
return info;
}
}
Spring Configuration for Shiro
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Define the realm you want to use to connect to your back-end security datasource: -->
<bean id="myRealm" class="com.realm.MyRealm"></bean>
<bean id="securityManager" class="org.apache.shiro.mgt.DefaultSecurityManager">
<!-- Single realm app. If you have multiple realms, use the 'realms' property instead. -->
<property name="realm" ref="myRealm"/>
<property name="sessionManager.sessionListeners">
<list>
<ref bean="mySessionListener" />
</list>
</property>
</bean>
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<!-- For simplest integration, so that all SecurityUtils.* methods work in all cases, -->
<!-- make the securityManager bean a static singleton. DO NOT do this in web -->
<!-- applications - see the 'Web Applications' section below instead. -->
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/>
<property name="arguments" ref="securityManager"/>
</bean>
<bean id="mySessionListener" class="com.listner.MySessionListener" ></bean>
</beans>
Demo
public class ShiroTest {
public static void main(String[] args) {
AbstractApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
context.registerShutdownHook();
org.apache.shiro.subject.Subject subject=SecurityUtils.getSubject();
AuthenticationToken token=new UsernamePasswordToken("username", "password");
System.out.println("Login a user--");
subject.login(token);
System.out.println("User logged in---"); subject.logout(); System.out.println("User logged out");
}
}
A fully functional demo available on GitHub https://github.com/ankitkatiyar91/java-framework-examples/tree/master/spring-examples/SpringShiro
Check CMS application that usages Shiro for security https://github.com/ankitkatiyar91/cms-java