shiro基础学习(三)—shiro授权
一、入门程序
1.授权流程

2.授权的三种方式
(1)编程式: 通过写if/else 授权代码块完成。
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("admin")) {
//有权限
} else {
//无权限
}
(2)注解式: 通过在执行的Java方法上放置相应的注解完成。
@RequiresRoles("admin")
public void hello() {
//有权限
}
(3)JSP/GSP 标签: 在JSP/GSP 页面通过相应的标签完成。
<shiro:hasRole name="admin">
<!— 有权限—>
</shiro:hasRole>
3.ini文件
shiro-permission.ini

在ini文件中用户、角色、权限的配置规则是:“用户名=密码,角色1,角色2...” “角色=权限1,权限2...”,首先根据用户名找角色,再根据角色找权限,角色是权限集合。
权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。
例子:
用户创建权限: user:create,或user:create:*
用户修改实例001的权限: user:update:001
用户实例001的所有权限: user:*:001
4.测试代码
/*
* 授权的测试
*/
public class AuthorzationTest{ //角色授权、资源授权测试 @Test
public void testAuthorzation(){
//创建SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini"); //创建SecurityManager
SecurityManager securityManager = factory.getInstance(); //将SecurityManager设置到系统环境
SecurityUtils.setSecurityManager(securityManager); //创建Subject
Subject subject = SecurityUtils.getSubject(); //创建token令牌
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123"); //执行认证
try{
subject.login(token);
}catch(AuthenticationException e){
e.printStackTrace();
} System.out.println("是否认认证通过: " + subject.isAuthenticated()); //基于角色的授权(角色标识)
boolean hasRole = subject.hasRole("role3");
System.out.println("基于角色的授权: " + hasRole); //基于资源的授权(权限标识符)
boolean permitted = subject.isPermitted("user:create");
System.out.println("基于资源的授权: " + permitted);
} }
结果:
是否认认证通过: true
基于角色的授权: false
基于资源的授权: true
二、自定义Realm
1.shiro-realm.ini
在shiro-realm.ini中配置自定义的realm,将realm设置到securityManager中。

2.实现代码
/*
* 自定义Realm
*/
public class CustomRealm extends AuthorizingRealm{ //设置Realm名称
@Override
public void setName(String name){
super.setName("customRealm");
} //用于认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException{ //1.从token取出用户身份信息
String userCode = (String)token.getPrincipal(); //2.根据用户userCode查询数据库
//模拟从数据库查询到的密码
String password = "123"; //3.查询到返回认证信息
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userCode,password,this.getName()); return info;
} //用于授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){ //获取主身份信息
String userCode = (String)principals.getPrimaryPrincipal(); //根据身份信息获取权限信息
//模拟从数据库获取到数据
List<String> permissions = new ArrayList<String>();
permissions.add("user:create"); //用户的创建权限
permissions.add("items:add"); //商品的添加权限 //将查询到授权信息填充到对象中
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermissions(permissions); return info;
}
}
3.测试代码
@Test
public void testCusRealm(){
//创建SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-realm.ini"); //创建SecurityManager
SecurityManager securityManager = factory.getInstance(); //将SecurityManager设置到系统环境
SecurityUtils.setSecurityManager(securityManager); //创建Subject
Subject subject = SecurityUtils.getSubject(); //创建token令牌
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123"); //执行认证
try{
subject.login(token);
}catch(AuthenticationException e){
e.printStackTrace();
} System.out.println("是否认认证通过: " + subject.isAuthenticated()); //基于资源的授权(权限标识符)
boolean permitted = subject.isPermitted("user:create");
System.out.println("基于资源的授权: " + permitted);
}
shiro基础学习(三)—shiro授权的更多相关文章
- shiro基础学习(四)—shiro与项目整合
一.认证 1.配置web.xml 2.配置applicationContext.xml 在applicationContext.xml中配置一个bean,ID和上面的过滤器的名称一致. ...
- shiro基础学习(二)—shiro认证
一.shiro简介 shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证.权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架. 以下 ...
- Shiro:学习笔记(2)——授权
Shiro:学习笔记(2)——授权 Shiro的三种授权方式 编程式: Subject subject = SecurityUtils.getSubject(); if(subject.hasRole ...
- Shiro笔记(三)授权
Shiro笔记(三)授权 一.授权方式 1.编程式: Subject subject=SecurityUtils.getSubject(); if(subject.hasRole("root ...
- Python入门基础学习 三
Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...
- Python基础学习三
Python基础学习三 1.列表与元组 len()函数:可以获取列表的元素个数. append()函数:用于在列表的最后添加元素. sort()函数:用于排序元素 insert()函数:用于在指定位置 ...
- Django基础学习三_路由系统
今天主要来学习一下Django的路由系统,视频中只学了一些皮毛,但是也做下总结,主要分为静态路由.动态路由.二级路由 一.先来看下静态路由 1.需要在project中的urls文件中做配置,然后将匹配 ...
- Shiro基础学习(一)—权限管理
一.基本概念 1.权限管理 只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源. 权限管理 ...
- Java基础学习(三)—面向对象(上)
一.理解面向对象 面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...
随机推荐
- c++中,int *a=new int(120)语句的意思
int *a=new int(120); 申请一个整型变量空间,赋初值为120,并定义一个整型指针a指向该地址空间 int *a=new int[120]; 申请120个整型变量空间,没有赋初值,并定 ...
- 零基础HTML编码学习笔记
任务目的 了解HTML的定义.概念.发展简史 掌握常用HTML标签的含义.用法 能够基于设计稿来合理规划HTML文档结构 理解语义化,合理地使用HTML标签来构建页面 任务描述:完成一个HTML页面代 ...
- C语言中的函数、数组与指针
1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念: 函 ...
- Linux系统(五)负载均衡LVS集群之DR模式
序言 DR模式是lvs集群中三种负载均衡模式的其中一种,那么上一篇中我写啦关于NAT模式的搭建与原理,为什么还要有DR模式与IP隧道模式呢? 首先我们来看3张图.LVS/NAT模式如下图: LVS/I ...
- 搭建windows环境下(nginx+mysql+php)开发环境
搭建windows环境下(nginx+mysql+php)开发环境 1. 所需准备应用程序包 1.1 nginx 程序包nginx-1.0.4.zip或其他版本(下载地址: http ...
- Unity Shader 知识点总结(一)
在学习了一段时间的Unity Shader后,打算写一些知识总结,便于今后的查找.如有错误,希望大家指出更改. 本文参照的unity入门精要一书,做一个知识归纳,如有兴趣可以看看其开源的部分,是一本比 ...
- MBProgressHUD各种样式用法
demo 来源: https://github.com/jdg/MBProgressHUD/ p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px ...
- webots自学笔记(三)控制器与电机控制
原创文章,来自“博客园,_阿龙clliu” http://www.cnblogs.com/clliu/,装载请注明原文章出处. 上一次建了四足机器人的模型,模型文件在上一篇有下载地址,这一次用控制器让 ...
- Servlet 与 Ajax 交互一直报status=parsererror
原因:servlet 返回的数据不是 Json 格式 1.JS代码为: var jsonStr = {'clusterNum':2,'iterationNum':3,'runTimes':4}; $. ...
- Xamarin.Android Binding篇
前言 趁着失业了,闲着没事儿学习了下Xamarin.Android binding,在以往的开发中,我相信很多人都遇到过binding的坑,也不例外, 我也踩了很多雷,好在认识了个大佬,指导了很多 ...