Shiro教程,Shiro 配置文件详细解释,Shiro自定义Filter配置

soゝso 2016-12-18 20:48:37 40571

shiro demo下载

Shiro + SSM(框架) + Freemarker(jsp)讲解的权限控制Demo,还不赶快去下载?




  Shiro  权限配置一般使用的有两种,一种是采用注解的方式,在我们的  Controller  方法上,或者Action 方法上写入一些权限判断注解,具体怎么使用,我不做介绍,我主要推荐使用配置的方式。这也是我们现在要讲到的配置方式加载系统基础权限控制,采用对Url 进行控制。

一、Shiro配置文件配置方式

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
	<property name="securityManager" ref="securityManager" />
	<property name="loginUrl" value="/u/login.shtml" />
	<property name="successUrl" value="/" />
	<property name="unauthorizedUrl" value="/?login" />
	
	<!--	基本系统级别权限配置-->
	<property name="filterChainDefinitions" >
		<value>
			/page/login.jsp = anon	<!-- 登录相关不拦截 -->
			/page/register/* = anon
			/page/index.jsp = authc
			/page/addItem* = authc,roles[数据管理员]
			/page/file* = authc,roleOR[普通用户,数据管理员]
			/page/listItems* = authc,roleOR[数据管理员,普通用户]
			/page/showItem* = authc,roleOR[数据管理员,普通用户]
			/page/updateItem*=authc,roles[数据管理员]
			/** = anon <!-- 其他不拦截 -->
           </value>
	</property>
	<!-- 自定义shiro 的 Filter -->
      <property name="filters">
          <util:map>
             <entry key="login" value-ref="login"></entry>
          </util:map>
      </property>
</bean>

主要看上面的 filterChainDefinitions 部分,这里是配置我们的的url 和对应的Filter 关系配置。

重要:这里的加载顺序是自上而下,所以看到我们/** 写到最后,因为匹配不中最后都让这个匹配中。后面我们会讲到采用配置文件加载怎么有序加载。

二、Shiro filterChainDefinitions 中配置讲解

栗子1,带参数配置方式:

/admin/ask/editor.shtml = role[2008,2009]

上面配置的意义:就是在请求/admin/ask/editor.shtml 链接时候进入别名为 role Shiro Filter ,并且参数为数组[2008,2009] ,这里参数的意思是角色编号。具体这个参数怎么取,最下面的 5.2 点看代码。

栗子2,简单配置方式:

/admin/ask/editor.shtml = role

上面的配置意义: 就是在请求/admin/ask/editor.shtml 链接时候进入别名为 role Shiro Filter

栗子3,多个Shiro Filter配置方式:

/admin/ask/editor.shtml = login,role[2008,2009]

上面配置意义: 就是在请求/admin/ask/editor.shtml 链接时候先进入 别名为 login Filter ,并且无参数。别名为login Filter 如果没通过,就不会走别名为role Filter ,如果别名为login Filter 返回true ,则进入别名为role Filter 。也就是从前到后。

这样的场景是很正常的业务场景,就是先判断登录,再判断角色权限。

栗子4,Shiro Filter的执行顺序:

记住这句话, “ 自上而下,从左到右” 即可。如下代码:

/admin/ask/editor.shtml = login,role[2008,2009]
/admin/ask/** = login,role[007]

如果来了一个链接为“/admin/ask/update.shtml ” ,先对比 /admin/ask/editor.shtml 是否匹配,如果匹配不中再走下面的通配/admin/ask/**  匹配中了后,再执行 login Filter ,然后通过login Filter 后再执行 role[007] Filter

所以记住一点,权限为金字塔状,先精确匹配或是权限稍小在前面,权限大(模糊匹配)的在后面。具体可以看栗子5.

栗子5,通配(模糊匹配):

/admin/ask/** = login,role[007]
/admin/** = login,role[008]
/** = login

上面是一个典型的金字塔式匹配方式,/** 是匹配所有,也就是如果上面的/admin/ask/** /admin/**  都匹配不中的时候,才走 /** = login 。如果反过来配置,如下:

/** = login
/admin/** = login,role[008]
/admin/ask/** = login,role[007]

这样配置的话,全部都走 /** = login了,下面的2个不可能会走。再看下面:

/admin/** = login,role[008]
/admin/ask/** = login,role[007]
/** = login

这样配置的话,那就永远都不会走 /admin/ask/**,因为都给 /admin/** 拦截了。

三、Shiro 的默认Filter 对应的类

 Filter名称  类路径(点击可以进入官方介绍,强烈建议看看
 anon  org.apache.shiro.web.filter.authc.AnonymousFilter
 authc  org.apache.shiro.web.filter.authc.FormAuthenticationFilter
 authcBasic  org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
 logout  org.apache.shiro.web.filter.authc.LogoutFilter
 noSessionCreation  org.apache.shiro.web.filter.session.NoSessionCreationFilter
 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

四、自定义Shiro Filter 配置

定义Shiro Filter bean ,在  Spring  相关配置文件中配置。

<!-- 自定义Filter bean-->
<bean id="login" class="com.sojson.core.shiro.filter.LoginFilter">
	<property name="customShiroSessionDAO" ref="customShiroSessionDAO"/>
</bean>
<bean id="role" class="com.sojson.core.shiro.filter.RoleFilter"/>
<bean id="permission" class="com.sojson.core.shiro.filter.PermissionFilter"/>
<bean id="simple" class="com.sojson.core.shiro.filter.SimpleAuthFilter"/>

定义Shiro Filter Bean  对应关系。

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
     <!-- 省略配置,参考上面的代码 -->
     <!-- 自定义shiro 的 Filter -->
     <property name="filters">
         <util:map>
             <!--  key 定义 Filter的别名,而 value-ref 对应上面bean的id -->
             <entry key="login" value-ref="login"></entry>
             <entry key="role" value-ref="role"></entry>
             <entry key="simple" value-ref="simple"></entry>
             <entry key="permission" value-ref="permission"></entry>
             <entry key="kickout" value-ref="kickoutSessionFilter"></entry>
          </util:map>
      </property>
</bean>

这样就配置完成了。

五、自定义Shiro Filter

上面配置了Shiro Filter ,那下面举个栗子,然后以判断角色(role) Filter 的代码。

5.1 摘取配置文件中对Filter的配置:

/admin/ask/editor.shtml = role[2008,2009]

解释一下上面代码的意思,就是在请求/admin/ask/editor.shtml 链接时候进入别名为 role Shiro Filter ,并且参数为数组[2008,2009] ,这里参数的意思是角色编号。

5.2 Java代码,RoleFilter的定义:

package com.sojson.core.shiro.filter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.StringUtils;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;
/**
 * 
 * 开发公司:SOJSON在线工具 <p>
 * 版权所有:© www.sojson.com<p>
 * 博客地址:https://www.sojson.com/blog/  <p>
 * <p>
 * 
 * 角色判断校验
 * 
 * <p>
 * 
 * 区分 责任人 日期    说明<br/>
 * 创建 周柏成 2016年6月2日  <br/>
 *
 * @author zhou-baicheng
 * @email  so@sojson.com
 * @version 1.0,2016年6月2日 <br/>
 * 
 */
public class RoleFilter extends AccessControlFilter {

	static final String LOGIN_URL = "https://www.sojson.com/user/open/toLogin.shtml";
	static final String UNAUTHORIZED_URL = "https://www.sojson.com/unauthorized.html";
	
	@Override
	protected boolean isAccessAllowed(ServletRequest request,
			ServletResponse response, Object mappedValue) throws Exception {
		//取到参数[2008,2009] ,强制转换判断。
		String[] arra = (String[])mappedValue;
		
		Subject subject = getSubject(request, response);
		for (String role : arra) {
			//判断是否有拥有当前权限,有则返回true
			if(subject.hasRole("role:" + role)){
				return true;
			}
		}
		return false;
	}

	@Override
	protected boolean onAccessDenied(ServletRequest request,
			ServletResponse response) throws Exception {
		
			Subject subject = getSubject(request, response);  
	        if (subject.getPrincipal() == null) {//表示没有登录,重定向到登录页面  
	            saveRequest(request);  
	            WebUtils.issueRedirect(request, response, LOGIN_URL);  
	        } else {  
	            if (StringUtils.hasText(UNAUTHORIZED_URL)) {//如果有未授权页面跳转过去  
	                WebUtils.issueRedirect(request, response, UNAUTHORIZED_URL);  
	            } else {//否则返回401未授权状态码  
	                WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);  
	            }  
	        }  
		return false;
	}

}

这样说的很清楚了吧。再有问题加群交流。


版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/199.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

相关文章
Druid数据库配置详细介绍。网上一团糟。
BlockingQueue 方法详细描述
HttpClient 获取详细的头信息
Shiro + EHCache 缓存的使用。
Elasticsearch教程(一),全程直播(小白级别)
Elasticsearch教程(二),IK分词器安装
Elasticsearch教程(三),IK分词器安装 (极速版)
Elasticsearch教程(四) elasticsearch head 插件安装和使用
Elasticsearch教程(五) elasticsearch Mapping的创建
Elasticsearch教程(六) elasticsearch Client创建
最新文章
ICP怎么操作取消备案,企业、个人怎么自己申请取消备案? 19
Javascript 加密/压缩后运行不了,JavaScript报错排查讲解 44
JavaScript 不可逆加密问题排查之方案一(闭包优化) 45
Java爬虫,Jsoup 爬取大众点评、美团商家信息电话号码解决方案 244
分解质因数 JavaScript 计算方式,及分解质因数讲解 8
湖南腾众4s店服务怎么样?进来看看你就知道了 29
SEO 之 SpringMVC redirect 301,301和302区别详细讲解 82
网站如何设置404页面、500等错误页面,有什么漏洞?怎么预防? 103
Java 文字转图片输出,Java 输出透明背景图片,Java文字转图片防爬虫 155
HttpClient获取访问域名的真实ip,HttpClient请求获取目标IP地址 299
最热文章
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 175216
Elasticsearch教程(四) elasticsearch head 插件安装和使用 138313
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 118026
Elasticsearch教程(六) elasticsearch Client创建 81990
Elasticsearch教程(一),全程直播(小白级别) 77107
Elasticsearch教程(二),IK分词器安装 77063
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 76749
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 75285
Elasticsearch教程(五) elasticsearch Mapping的创建 69399
Elasticsearch教程(三),IK分词器安装 (极速版) 58152

骚码加入我们 / 千人QQ群:259217951

入群需要5元,如果没有QQ钱包,可以先Alipay、微信,赞助然后加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

正在加载... ...