Spring和整合实际上最大的特点就是可以交由Spring实现shiro的管理控制,实际上这种整合才属于新一代的SSM开发框架整合(Spring+Shiro+MyBatis)。
SSH:Spring + Struts + Hibernate,但是后来Struts框架没落了;
SSM一代:Spring + SpringMVC + MyBatis,SpringMVC本来就属于Spring的一部分;
SSM二代:Spring + Shiro + MyBatis;
一、Spring整合Shiro:
1. 修改pom.xml配置文件,引入Shiro与Spring要整合的依赖库:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
</dependency>
2. 修改web.xml配置文件,通过过滤器集成shiro:
》 DelegatingFilterProxy 实际上是 Filter 的一个代理对象. 默认情况下, Spring 会到 IOC 容器中查找和 <filter-name> 对应的 filter bean. 也可以通过 targetBeanName 的初始化参数来配置 filter bean 的 id.
<!-- 配置Shiro的 shiroFilter --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> <!-- <init-param> <param-name>targetBeanName</param-name> <param-value>shiroFilter</param-value> </init-param>--> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
3. 定义Realm:
// 此处不使用扫描配置,通过bean配置文件的模式来完成 public class MemberRealm extends AuthorizingRealm { @Autowired private IMemberService memberService ; @Autowired private IMemberPrivilegeService memberPrivilegeService ; @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.err.println("【1】{MemberRealm}============== 用户认证处理 =============="); String mid = (String) token.getPrincipal() ; Member member = this.memberService.get(mid) ; // 根据mid查询用户信息 if (member == null) { // 用户信息不存在 throw new UnknownAccountException(mid + "账户信息不存在!") ; } String password = new String((char[]) token.getCredentials()) ; if (!member.getPassword().equals(password)) { // 密码不同 throw new IncorrectCredentialsException("错误的用户名或密码!"); } if (member.getLocked().equals(1)) { // 用户锁定了 throw new LockedAccountException(mid + "账户已经被锁定!"); } return new SimpleAuthenticationInfo(token.getPrincipal(),token.getCredentials(),this.getName()); } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { System.err.println("【2】{MemberRealm}************** 用户授权处理 **************"); Map<String, Set<String>> map = this.memberPrivilegeService.getByMember((String) principals.getPrimaryPrincipal()); // 将所有获取的授权信息保存在AuthorizationInfo类的实例之中 SimpleAuthorizationInfo authz = new SimpleAuthorizationInfo() ; // 返回的授权信息 authz.setRoles(map.get("allRoles")); authz.setStringPermissions(map.get("allActions")); return authz; } }
4. 定义shiro的配置文件“spring-shiro.xml”:
<?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"> <!-- 1、Shiro整合处理的时候,Realm是整合业务层(RPC端)的核心处理综合点 --> <bean id="memberReam" class="com.yootk.ssm.realm.MemberRealm"/> <!-- 2、整个的Shiro里面最为重要的就是SecurityManager,这个类之中需要追加realm配置 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="memberReam"/> <!-- 配置要使用的Realm处理程序 --> </bean> <!-- 3、 在Spring中配置有关Shiro的全部的过滤器的定义,这个名称必须与web.xml文件保持一致--> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="/login.action"/> <!-- 配置登录页 --> <property name="filterChainDefinitions"><!-- 检测路径 --> <value> /pages/**=authc </value> </property> </bean> </beans>