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

JSON 2016-12-18 20:48:37 67885

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共享配置以及实现
Elasticsearch教程,Elasticsearch配置文件 — elasticsearch.yml
Java有序读取配置文件,有序读取ini配置文件
Shiro 通过配置Cookie 解决多个二级域名的单点登录问题。
Druid数据库配置详细介绍。网上一团糟。
最新文章
XML内部实体和外部实体 90
Java面向对象编程概念 101
PHP回显语句 91
Linux—文件树 116
C语言while循环和do while循环 131
Python元组剖析 200
MySQL触发器教程 296
sql使用布尔运算符和关系运算符 241
C语言的变量和常量 296
PostgreSQL:数据库角色 123
最热文章
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 681970
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 674712
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 601960
免费天气API,天气JSON API,不限次数获取十五天的天气预报 576653
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 552868
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 509341
Elasticsearch教程(四) elasticsearch head 插件安装和使用 479946
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 264412
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 244246
Elasticsearch教程(一),全程直播(小白级别) 225520
支付扫码

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

查看我的收藏

正在加载... ...