关于shiro和spring的整合学习笔记(一)框架搭建

来源:互联网 发布:淘宝卡 编辑:程序博客网 时间:2024/06/07 02:51

注:下面操作是基于spring+springmvc+mybatis框架已经整合好了的情况下


首先。加入shiro的依赖或者jar包

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-all</artifactId><version>1.2.3</version></dependency>

加入依赖后,第一步,先在web.xml中配置Filter,

shiro与Spring整合后,shiroFilter需要交给Spring容器来生成,

Spring要生成一个shiroFilter的bean,然后再把这个filterBean交给Servlet,达到生效的目的。

<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></filter>  <filter-mapping>  <filter-name>shiroFilter</filter-name>  <url-pattern>/*</url-pattern>  </filter-mapping>

targetFilterLifecycle:默认为false, 如果是false则表示shiroFilter的生命周期交给Spring容器来处理, 如果是true,表示把shiroFilter交给Servlet来管理。

我们需要shiroFilter被代理生成后立刻被Servlet容器加载,所以应该将其设为true。

之后在resources配置文件下创建applicationContext-shiro.xml(Spring整合的配置文件)

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd         http://www.springframework.org/schema/context         http://www.springframework.org/schema/context/spring-context-3.0.xsd         http://www.springframework.org/schema/tx         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd         http://www.springframework.org/schema/aop          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"><!-- 1.配置一个lifeCycleBeanProcessor,shiro和Spring整合之后,shiro的组件都以bean的方式交给Spring容器来管理 --><bean id="lifeCycleBeanProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"></bean><!-- Spring容器是通过动态代理的方式,为lifeCycle生成代理对象,所以需要depends-on指定一下 --><bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"depends-on="lifeCycleBeanProcessor"><!-- proxyTargetClass:默认为false 是基于接口的JDK代理如果是true则是表示启用cglib基于类代理 --><property name="proxyTargetClass" value="true"></property></bean><!-- 虽然lifeCycle是基于接口的,理应被jdk代理,但是,设计者要求必须被cglib代理,要不然shiro的很多组件不能被生成,所以需要强制开启cglib代理 --><aop:aspectj-autoproxy proxy-target-class="true"/><!--  安全管理器配置shiro的核心组件,安全管理器,这个类,能帮助我们进行登录验证和权限验证。但是需要我们提供给他登录者的真实信息(正确的登录信息和权限信息),这个代码我们会写在一个类里,一般叫AuthRealm,并且这个类要实现AuthorizingRealm,并且在安全管理器里注册,要不然,shiro收不到你提供的的信息,所以也就做不了验证 --><bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"><!-- property 的name是realm,固定,写死的 --><property name="realm" ref="AuthRealm"></property></bean><bean id="AuthRealm" class="com.mrlv.ht.shiro.AuthRealm"></bean><!-- 权限管理器,想干活得让安全管理器知道 --><bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"><property name="securityManager" ref="securityManager"></property></bean><!-- 配置shiroFilter的bean,在这里,通过配置,让spring容器代理生成Filter实现整个网站的url过滤拦截,需要配置一下shiro的安全管理器 这个名字得与web.xml里配置shiroFilter的名字一致,因为Spring是根据bean的id进行管理的 --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><property name="securityManager" ref="securityManager"></property><!-- 设置网页的登录界面 --><property name="loginUrl" value="/tologin"></property><property name="filterChainDefinitions"><value>/staticfile/**=anon<!-- 静态资源文件需要放行,因为需要展示图片,css,和js等 -->/validate/doLogin=anon<!-- 配置登录验证的访问路径放行,要不然接受不到传过来的登录名和密码 -->/**=authc<!-- 除了上述两个路径资源被放行外,其他资源全部拦截 --></value></property></bean></beans>

需要注意:shiroFilter名称和web.xml中定义名称要相同

然后根据配置文件需求创建一个AuthRealm.java

package com.mrlv.ht.shiro;public class AuthRealm extends AuthorizingRealm{@Override//权限管理的资料提交protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {return null;}@Override//登录验证的资料提交protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {return null;}}

controller内代码如下

package com.mrlv.ht.controller;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.subject.Subject;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import com.mysql.jdbc.StringUtils;@Controllerpublic class LoginController {@RequestMapping("/tologin")public String tologin() {return "/validate/login";}@RequestMapping("/validate/doLogin")public String login(String username, String password,Model model) {//创建Shiro的验证主体,subject,实际上也可以理解为当前登录的User,只不过Subject的含义更宽泛//因为在安全领域中登录系统的对象或许并不是一个真正的用户,也可能是一个线程。Subject subject = SecurityUtils.getSubject();//非空验证if(StringUtils.isEmptyOrWhitespaceOnly(username) ||StringUtils.isEmptyOrWhitespaceOnly(password)) {subject.getSession().setAttribute("errorInfo", "用户名或密码不能为null");return "redirect:/";}//当调用login(token)方法时,就会去执行自定义Realm里的Authentication(token)方法,//当验证失败时,会抛异常。try {subject.login(token);subject.getSession().setAttribute("username", username);return "redirect:/index";} catch (Exception e) {model.addAttribute("errorInfo", "用户名或密码err");//subject.getSession().setAttribute("errorInfo", "用户名或密码err");return "/validate/login";}}}


如此,只要运行tomcat不报错,那么搭建就成功了。

过滤器简称

对应的类java

anon

org.apache.shiro.web.filter.authc.AnonymousFilter

authc

org.apache.shiro.web.filter.authc.FormAuthenticationFilter

authcBasic

org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter

perms

org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

port

org.apache.shiro.web.filter.authz.PortFilter

rest

org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter

roles

org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

ssl

org.apache.shiro.web.filter.authz.SslFilter

user

org.apache.shiro.web.filter.authc.UserFilter

logout

org.apache.shiro.web.filter.authc.LogoutFilter



原创粉丝点击