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

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

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

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

本文主题:

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

关于作者
一个低调而闷骚的男人。
相关文章
Shiro教程(六)Shiro整体的配置文件
Shiro教程(四)Shiro + Redis配置
Ehcache配置详细解释
Shiro教程(三)Shiro web.xml中Filter配置配置注意事项
Shiro教程(十)Shiro 权限动态加载与配置精细讲解
Shiro教程(七)Shiro Session共享配置以及实现
Java有序读取配置文件,有序读取ini配置文件
Elasticsearch教程,Elasticsearch配置文件 — elasticsearch.yml
Druid数据库配置详细介绍。网上一团糟。
Shiro 通过配置Cookie 解决多个二级域名的单点登录问题。
最新文章
QUIC / HTTP3 协议详细分析讲解 688
恭喜那个做云存储的七牛云完成 F 轮 10 亿人民币的融资,开启新的云旅程 1310
Autojs怎么安全加密?Autojs在线加密工具注意事项。 2191
Java JSON 组件选型之 FastJson 为什么总有漏洞? 6250
使用七牛云存储实现图片API,自动删除图片方案合集 2271
神速ICP备案经验分享,ICP备案居然一天就通过了 3484
百度加强推送URL链接,百度SEO强行推送链接JavaScript代码案例讲解。 3754
SOJSON 拓展服务器被DDos攻击了一晚上,是如何解决的? 4498
湖南地区备案“新增网站需提交组网方案或解释说明”,关于备案做简单叙述 4560
企查查你是个什么企业,骗子的帮凶,诈骗的集中营,通过企查查骚扰企业电话不断,为所欲为的企查查 11409
最热文章
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 458396
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 429639
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 361498
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 347438
免费天气API,天气JSON API,不限次数获取十五天的天气预报 313868
Elasticsearch教程(四) elasticsearch head 插件安装和使用 235352
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 198881
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 144503
Elasticsearch教程(一),全程直播(小白级别) 125453
Elasticsearch教程(五) elasticsearch Mapping的创建 102578

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

入群需要5元为的是没有垃圾广告,如果没有QQ钱包,可以加群主拉进。

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

支付扫码

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

查看我的收藏

正在加载... ...