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

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

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>
 * 博客地址:http://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 = "http://www.sojson.com/user/open/toLogin.shtml";
	static final String UNAUTHORIZED_URL = "http://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

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

本文主题:

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

关于作者
目前就职于国内某电商平台公司打杂。。
相关文章
Shiro教程Shiro 配置文件详细解释Shiro自定义Filter配置
Shiro教程(六)Shiro整体的配置文件
Shiro教程(四)Shiro + Redis配置
Ehcache配置详细解释
Shiro教程(三)Shiro web.xml中Filter配置配置注意事项
Shiro教程(十)Shiro 权限动态加载与配置精细讲解
Shiro教程(七)Shiro Session共享配置以及实现
Java有序读取配置文件,有序读取ini配置文件
Elasticsearch教程,Elasticsearch配置文件 — elasticsearch.yml
Shiro 通过配置Cookie 解决多个二级域名的单点登录问题。
最新文章
天气API,全国天气 JSON API接口,可以获取十五天的天气预报 10
Springboot + Freemarker 集成配置 45
DNS查询, DNS测速检查接口,DNS测速接口 17
Mysql 并发插入、存在不插入,存在更新操作 36
SOJSON 阿里云活动达到67人,最终获得5年的1核2GB的ECS服务器使用权益 25
Java 完美解析.plist & 生成plist ,Android 解析.plist 28
Java SHA1的几种实现方式,Java SHA1 签名 50
Mac下Charles-proxy 抓包工具,iPhone 抓包演示 16
Mac Fidder 抓包替代方案 Charles-proxy 抓包工具下载 + 安装 + 破解 charles.jar 下载 178
阿里ECS云服务,1核2G1M宽带 40G SSD硬盘, 9 9一年,189二年,279三年 23
最热文章
Elasticsearch教程(四) elasticsearch head 插件安装和使用 117135
Elasticsearch教程(六) elasticsearch Client创建 75853
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 72356
Elasticsearch教程(二),IK分词器安装 70214
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 64083
Elasticsearch教程(一),全程直播(小白级别) 57793
Elasticsearch教程(五) elasticsearch Mapping的创建 55748
Elasticsearch教程(三),IK分词器安装 (极速版) 55125
Elasticsearch教程(七) elasticsearch Insert 插入数据(Java) 50396
Elasticsearch权威指南-中文.pdf,Elasticsearch 中文文档下载 43317

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

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

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

支付扫码

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

正在加载... ...