Shiro Review——使用ini文件进行授权测试

一,shiro授权

授权流程:

跟用户的认证流程类似,shrio在用户授权的时候,最后还是去Realm获取信息。

shiro的三种授权方式:

Shiro 支持三种方式的授权:

  • 编程式:通过写if/else 授权代码块完成:

Subject subject = SecurityUtils.getSubject();

if(subject.hasRole(“admin”)) {

//有权限

} else {

//无权限

}

  • 注解式:通过在执行的Java方法上放置相应的注解完成:

@RequiresRoles("admin")

public void hello() {

//有权限

}

  • JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:

<shiro:hasRole name="admin">

<!— 有权限—>

</shiro:hasRole>

二,代码测试shrio授权

首先编写ini文件:

#用户
[users]
#用户zhang的密码是123,此用户具有role1和role2两个角色
zhangsan=123,role1,role2

#权限
[roles]
#角色role1对资源user拥有create、update权限
role1=user:create,user:update
#角色role2对资源user拥有create、delete权限
role2=user:create,user:delete
#角色role3对资源user拥有create权限
role3=user:create

权限标识符号规则:资源:操作:实例(中间使用半角:分隔)

user:create:01  表示对用户资源的01实例进行create操作。

user:create:表示对用户资源进行create操作,相当于user:create:*,对所有用户资源实例进行create操作。

例如,user:*:01  表示对用户资源实例01进行所有操作。

授权测试代码:

/**
 * 授权测试
 * @author LiuHuiChao
 *
 */
public class AuthorizationTest {

	//角色授权,资源授权
	@Test
	public void  testAuthorization(){
		//创建SecurityManager工厂
		Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro-permission.ini");
		//创建SecurityManager
		SecurityManager securityManager=factory.getInstance();
		//将SecurityManager设置到系统运行环境,和spring整合后将SecurityManager配置到spring容器中
		SecurityUtils.setSecurityManager(securityManager);
		//创建subject
		Subject subject=SecurityUtils.getSubject();
		//执行认证
		UsernamePasswordToken token=new UsernamePasswordToken("zhangsan","123");
		try {
			subject.login(token);
		} catch (AuthenticationException e) {
			e.printStackTrace();
		}
		System.out.println("认证状态:"+subject.isAuthenticated());

		//认证通过后执行授权
		/*基于角色的授权*/
		boolean IsHasRole=subject.hasRole("role1");
		System.out.println("是否有role1权限:"+IsHasRole);
		//判断是否拥有多个角色
		boolean hasAllRoles=subject.hasAllRoles(Arrays.asList("role1","role2"));
		System.out.println("是否拥有所有角色([role1],[role2]):"+hasAllRoles);

		//使用check方法进行授权,如果授权不通过,抛出异常
		try {
			subject.checkRole("role12");
		} catch (AuthorizationException e) {
			System.out.println("用户没有role12角色");
			e.printStackTrace();
		}

		/*基于资源的授权*/
		boolean isPermitted=subject.isPermitted("user:create:1");
		System.out.println("是否有user:create权限:"+isPermitted);
		boolean isPremittedAll=subject.isPermittedAll("user:create","user:delete");
		System.out.println("是否有user:create,user:delete权限:"+isPermitted);

		//使用无返回值的check
		try {
			subject.checkPermission("user:post");
		} catch (AuthorizationException e) {
			System.out.println("用户没有user:post权限");
			e.printStackTrace();
		}
	}
}

注意,只需在用户认证代码的基础上接着加就ok了,这样就完成了简单的用户认证+授权。

时间: 2024-11-04 07:45:44

Shiro Review——使用ini文件进行授权测试的相关文章

Shiro Review——自定义Realm实现认证

一,自定义Realm 在之前,使用过下面的ini文件进行认证测试: #对用户信息进行配置 [users] #用户名跟密码 zhangsan=111111 lisi=111111 里面用户的认证信息是写死的,so,now ,来测试下使用自定义Realm来从我们的DB读取User信息,完成用户认证. 首先大致看下Realm的类层级关系: 比如,我们之前使用ini文件中的users配置用户名跟密码的时候,认证和时候使用的Realm就是IniRealm,比如里面的JdbcRealm,我们可以在数据库里面

Windows下MySQL的my.ini文件字符集测试

环境:Windows 8.1+MySQL 5.6.19 首先要说明的是Windows下MySQL的my.ini所在位置为:盘符\ProgramData\MySQL\MySQL Server 5.6下,也就是下图的Data Path下,如果是系统盘,ProgramData的文件夹是隐藏的;非系统盘此文件不是隐藏的.并不是Program Files下的. 2,查看my.ini文件,默认安装的编码都是utf8的. default-character-set=utf8 character-set-ser

(转)shiro权限框架详解05-shiro授权

http://blog.csdn.net/facekbook/article/details/54910606 本文介绍 授权流程 授权方式 授权测试 自定义授权realm 授权流程 开始构造SecurityManager环境subject.isPermitted()授权securityManager.isPermitted()执行授权Authorizer执行授权Realm根据身份获取资源权限信息结束 授权方式 Shiro支持三种方式的授权: 编程式:通过写if/else授权代码块完成. Sub

MySQL数据库安装,配置My.ini文件

最近在做项目开发时用到了MySql数据库,在看了一些有关MySql的文章后,很快就上手使用了.在使用的过程中还是出现了一些问题,因为使用的是绿色免安装版的MySql所以在配置的时候出现了一些问题,该篇文章就主要针对MySql绿色版的配置及其使用进行讨论. 一.MySql概述 MySql数据库是有瑞典MySql AB公司开发,现在该公司被Oracle收购属于Oracle所有.同SQL Server类似,它也是基于关系型数据库的数据库管理系统,在Web应用方面MySQL是最好的RDBMS之一,因为它

Js处理ini文件

.ini 是Initialization File的缩写,即初始化文件,ini文件格式广泛用于软件的配置文件. INI文件由节.键.值.注释组成. function parseINIString(data){ var regex = { section: /^\s*\[\s*([^\]]*)\s*\]\s*$/, param: /^\s*([\w\.\-\_]+)\s*=\s*(.*?)\s*$/, comment: /^\s*;.*$/ }; var value = {}; var lines

C++ 中使用boost::property_tree读取解析ini文件

boost 官网 http://www.boost.org/ 下载页面 http://sourceforge.net/projects/boost/files/boost/1.53.0/ 我下载的是 boost_1_53_0.tar.gz 使用系统  ubuntu 12.10 一.解压 [plain] view plaincopy tar -zxvf  boost_1_53_0.tar.gz 得到一个文件夹 boost_1_53_0,  拷贝其子目录 boost 到以下路径 [plain] vi

Qt对ini文件的读写

研究了以下Qt下ini文件的读写,不废话,上干货. 写入ini文件 WriteIni.cpp 1 void WriteIni::writeSettings() 2 { 3 QSettings settings("config.ini", QSettings::IniFormat); // 当前目录的INI文件 4 5 settings.beginGroup("mountinfo"); 6 settings.setValue("mount",6);

Configuration File (php.ini) Path Loaded Configuration File 都有加载php.ini文件,有什么不同的地方?

Configuration File (php.ini) Path /usr/local/php7/etc      这个目录下面也有php.ini文件(如果在编译./configure -with-config-file-path=/usr/local/php56/etc 指定了该参数的话) ,php-fpm启动是不加载该php.ini文件的Loaded Configuration File /usr/local/php7/lib/php.ini    这个是php-fpm启动加载的php.i

C++ 读取INI文件

Windows操作系统专门为此提供了6个API函数来对配置设置文件进行读.写: GetPrivateProfileInt() 从私有初始化文件获取整型数值GetPrivateProfileString() 从私有初始化文件获取字符串型值GetProfileInt 从win.ini 获取整数值GetProfileString 从win.ini 获取字符串值WritePrivateProfileString 写字符串到私有初始化文件WriteProfileString 写字符串到win.ini 我们