shiro入门实战笔记(4)--权限认证(上)

[本系列文章是博主的学习笔记,而非经典教程,特此说明]

在前一篇文章中,我们介绍了身份认证的相关内容,本文我们来介绍另一个十分重要的权限认证的内容。惯例,我们来先看一下本文的准备工作:

a.操作系统:win7 x64

b.开发工具:myeclipse 2014,jdk1.7,maven3.3.3

-----------------------------------------------------------------------------------------------------------------------------------------------

正文开始:

1.创建shiro03工程,工程结构如下图:【博主直接从shiro01工程复制过来,下图所示的文件中有冗余,请读者按照步骤创建即可】


2.我们来看一下本例中需要引入的jar包,pom文件的配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.java.shiro</groupId>
	<artifactId>shiro03</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>shiro03</name>
	<description>shiro03</description>
	<dependencies>
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-core</artifactId>
			<version>1.2.4</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.13</version>
		</dependency>
		<dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.1.2</version>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.38</version>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
	</dependencies>

</project>
写入上面的依赖,保存,maven会帮助我们自动的下载相关的包。下载号之后,我们在工程的maven dependencies下就可以看到如下内容,如果有遗漏,请读者认真检查。


3.在前文中,我们叙述了基本的读取shiro配置文件的方法实现,在本例中,我们需要使用到多个配置文件,因此我们把读取配置文件的方法抽象为一个单独的工具包

package com.shiro.common;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;

public class shiroUtil {
	public static Subject login(String filepath,String userName,String pwd){
		//读取配置文件,初始化SecurityManager工厂
				Factory<SecurityManager> factory = new IniSecurityManagerFactory(filepath);
				//获取SecurityManager实例
				SecurityManager securityManager = factory.getInstance();
				//把securityManager 实例绑定到SecurityUtils
				SecurityUtils.setSecurityManager(securityManager);
				//得到当前用户
				Subject currentUser = SecurityUtils.getSubject();
				//创建token令牌,用户名/密码
				UsernamePasswordToken token = new UsernamePasswordToken(userName,pwd);
				
				try {
					//登陆
					currentUser.login(token);
					System.out.println("success");
				} catch (Exception e) {
					e.printStackTrace();
					System.out.println("fail");
				}
				return currentUser;
	}
	
}

4.接着我们来看权限的配置文件,shiro_role.ini:

[users]
shiro01=1234,role1,role2
shiro02=1234,role1
5.创建上面配置的单元测试用例,RoleTest.java文件:

	@Test
	public void test() {
		Subject sub = shiroUtil.login("classpath:shiro_role.ini", "shiro02","1234");
//		System.out.println(sub.hasRole("role2")?"hasRole2":"noRole2");
//		System.out.println(sub.hasRoles(Arrays.asList("role1","role2","role3")));
		boolean[] re = sub.hasRoles(Arrays.asList("role1","role2","role3"));
		System.out.println(re[0]);
		System.out.println(re[1]);
		System.out.println(re[2]);
	}
在上面中,我们示例shiro提供给我们判断角色的方法,hasRole,hasRoles,hasRoles三种,请读者们仔细观察。具体运行结果请自行查看。

6.除了上面所示的权限判断方式外,shiro还提供另一种类别判断权限的方式。特别的,这种方式只有异常和正常执行之分,而内有返回值。具体代码示例如下:

	@Test
	public void check() {
		Subject sub = shiroUtil.login("classpath:shiro_role.ini", "shiro02","1234");
		sub.checkRole("role2");
		boolean[] re = sub.hasRoles(Arrays.asList("role1","role2","role3"));
		System.out.println(re[0]);
		System.out.println(re[1]);
		System.out.println(re[2]);
	}
在上面中,如果程序正常执行,那么控制台将会正常输出re数组的内容。反之,发生异常。另外还有两种,checkRoles的两种方式,请读者们自行执行代码查看。
7.上面的所有内容是基于角色的权限访问控制,下面我们来看看基于权限的访问控制。首先我们来配置权限的配置文件,shiro_permission.ini。具体内容如下:

[users]
shiro01=1234,role1,role2
shiro02=1234
[roles]
role1=user:select
role2=user:add,user:update,user:delete
8.然后,我们创建权限单元测试的代码,具体内容如下:

package com.shiro.test;

import static org.junit.Assert.*;

import org.apache.shiro.subject.Subject;
import org.junit.Test;

import com.shiro.common.shiroUtil;

public class PermissionTest {

	@Test
	public void testIsPermitted() {
		Subject sub = shiroUtil.login("classpath:shiro_permission.ini", "shiro02","1234");
		System.out.println(sub.isPermitted("user:select"));
	}

}
上面所示的方法在官方文档中还有更多的实现,本文之列举开发时常用的方法。另外,还有与上文对应的checkPermission方法等,相关内容原理及使用方法基本一致,请读者参考官方文档自行学习,这里不在累述。

------------------------------------------------------------------------------------------------------------------------

至此,shiro入门实战笔记(4)--权限认证(上)结束

备注:

本文中我们仅仅叙述角色权限认证的程序实现,请读者我们先自行实现上文所示例的代码,先自行理解上文涉及shiro中权限认证的基本方法,下一篇我们将介绍更多关于shiro权限认证的内容,并且详细介绍权限认证的流程,敬请期待!


参考资料:

官方文档:http://shiro.apache.org/documentation.html

其他博文:http://jinnianshilongnian.iteye.com/blog/2018936









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值