Shiro授权

  也叫访问控制,即在应用中控制谁能访问那些资源(如访问页面、编辑数据、页面操作等)。在授权中需要了解几个关键对象:主体(subject)、资源(resource)、权限(Permission)、角色(Role)。

Shiro授权需要了解的几个对象:

  主体:访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才能允许访问响应的资源。

  资源:在应用中用户可以访问的URL,比如JSP页面,查看/编辑某些数据,访问某个业务方法,打印文本等都是资源,只有经过用户授权后才可以访问。

  权限:安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权利。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面的查看/新增/修改/删除用户数据(即很多时候都是CRUD式权限控制)等。权限代表用户有没有操作某个资源的权利,即反应某个资源上的操作是否被允许。

  角色:权限的集合,一般情况下会赋予用户 角色而不是权限,这样用户可以拥有一组权限,赋予权限的时候比较方便,典型的如:项目经理、技术总监、CTO、开发工程师都是角色,不同的角色有一组不同的权限。

  Shiro支持操作用户模块的所有权限或操作某个用户的权限。

授权流程

  1.在Spring-shiro.xml中的页面配置上,给想要授权的页面添加访问许可,如给user.jsp和admin.jsp添加权限,user.jsp只能拥有user角色才能访问,而admin.jsp只能拥有admin角色才能访问,则过滤器配置如下:

    /user.jsp = roles[user]
/admin.jsp = roles[admin]

  或在Controller中给某个方法添加注解的方式,如上述给user.jsp页面添加权限,则在get请求上放添加@RequiresPermissions(value={"roles[user]"})注解即可。

  这样当我们登录成功后再想访问上述页面发现已经没有权限了!

  2.在配置好过滤器后,授权需要实现AuthorizingRealm类中的doGetAuthorizationInfo方法,因为AuthorizingRealm继承AuthenticatingRealm,但并没有实现AuthorizingRealm类中的doGetAuthorizationInfo方法,所以 ,我们在做认证和授权的时候只需要继承AuthorizingRealm就可以了,同时实现两个抽象方法:认证(doGetAuthenticationInfo)、授权(doGetAuthorizationInfo)即可。

  在进行多Realm认证的时候,调用的是ModularRealmAuthorizer,实际上还是走的AuthorizingRealm中的doGetAuthorizationInfo方法。

  3.之前在做认证的时候,我们继承的是认证Realm(AuthenticatingRealm),现在让它继承(AuthorizingRealm),并同时实现两个抽象类。

  4.在doGetAuthorizationInfo方法中实现授权的过程

    1.从principalCollection中获取登录用户的信息(principal对象)。

	     Principal principal = (Principal) getAvailablePrincipal(principals);
String loginName = principal.getName();

    2.利用登录的用户信息来获取当前用户的角色或权限(缓存中查询或者数据库中)。

		// 把角色信息查出来
List<Role> roles = UserUtils.getRolesByIds(user.getRoleIds(), user.getId());

    3.创建SimpleAuthorizationInfo对象,并设置roles属性,将info对象返回。

      SysUser user = UserUtils.getByLoginName(loginName);
if (user != null) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 把角色信息查出来
List<Role> roles = UserUtils.getRolesByIds(user.getRoleIds(), user.getId());
// 遍历他所拥有的角色
for (int i = 0; i < roles.size(); i++) { Role ro = roles.get(i); info.addRole(ro.getRole());
// 通过ResourceIds获取对应的权限信息
List<Resource> sresources = UserUtils.getPermissionByIds(ro.getResourceIds(), user.getId()); for (int j = 0; j < sresources.size(); j++) { Resource re = sresources.get(j);
//给info对象设置角色
info.addStringPermission(re.getPermission());
}
} return info; }

Shiro笔记(五)Shiro授权的更多相关文章

  1. Shiro学习笔记五(Shiro标签,及通配符)

    1.首先是导入标签库 <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> ...

  2. Shiro笔记(一)Shiro整体介绍

    介绍:是一个java的安全(权限)框架 可以完成的功能:认证登录(Authentication).授权(Authorization).加密(cryptography).会话管理(session man ...

  3. Shiro笔记(五)JSP标签

    Shiro笔记(五)JSP标签 导入标签库 <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags&q ...

  4. Shiro笔记(三)授权

    Shiro笔记(三)授权 一.授权方式 1.编程式: Subject subject=SecurityUtils.getSubject(); if(subject.hasRole("root ...

  5. Shiro第五篇【授权过滤、注解、JSP标签方式、与ehcache整合】

    授权过滤器测试 我们的授权过滤器使用的是permissionsAuthorizationFilter来进行拦截.我们可以在application-shiro中配置filter规则 <!--商品查 ...

  6. Shiro 自定义登陆、授权、拦截器

    Shiro 登陆.授权.拦截 按钮权限控制 一.目标 Maven+Spring+shiro 自定义登陆.授权 自定义拦截器 加载数据库资源构建拦截链 使用总结: 1.需要设计的数据库:用户.角色.权限 ...

  7. Shiro笔记(一)基本概念

    Shiro笔记(一)基本概念 一.简介 Shiro是一个Java安全框架,可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等. Authentication:身份认证/登录,验证用户是 ...

  8. 32、shiro框架入门3.授权

    一. 授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等).在授权中需了解的几个关键对象:主体(Subject).资源(Resource).权限(Permission ...

  9. Shiro笔记(四)编码/加密

    Shiro笔记(四)编码/加密 一.编码和解码 //base64编码.解码 @Test public void testBase64(){ String str="tang"; b ...

  10. Shiro笔记(二)身份验证

    Shiro笔记(二)身份验证 一.核心代码 @Test public void helloWorldTest(){ IniSecurityManagerFactory factory = new In ...

随机推荐

  1. 如何使用Jquery直接导入记事本的内容

    直接上代码 <!DOCTYPE html> <html> <head> <title> </title> </head> < ...

  2. linq基本操作

    一.Linq有两种语法: 1.  方法语法 2.  查询语法 下面举个例子看看这两种方法的区别 比如现在有一个学生类 public class student { public string user ...

  3. filter(HTML)滤镜用法

    CCS滤镜参考语法:STYLE="filter:filtername(fparameter1, fparameter2...)" (Filtername为滤镜的名称,fparame ...

  4. linux命令知识点

    1. 例二:列出当前目录中所有以“t”开头的目录的详细内容,可以使用如下命令: 命令:ls -l t* 例六:计算当前目录下的文件数和目录数 命令: ls -l * |grep "^-&qu ...

  5. LeetCode(112):路径总和

    Easy! 题目描述: 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及 ...

  6. java使用POI解析2007以上的Excel表格

    来自http://hao0610.iteye.com/blog/1160678 使用poi来解析Excel的xls和xlsx. 解析xls: package xls; import java.io.F ...

  7. python2.7 (x64) 调用 java 代码实践

    背景:公司实施接口自动化测试,使用的框架python+unittest:因为开发使用的架构师SpringBoot,在测试过程中难免需要使用到python调用JAVA的一些接口,所以需要用到python ...

  8. 论文阅读笔记十四:Decoupled Deep Neural Network for Semi-supervised Semantic Segmentation(CVPR2015)

    论文链接:https://arxiv.org/abs/1506.04924 摘要 该文提出了基于混合标签的半监督分割网络.与当前基于区域分类的单任务的分割方法不同,Decoupled 网络将分割与分类 ...

  9. azkaban安装使用

    本文记录azkaban的安装和 一些报错处理(文章末尾). AzKaban组成 MySQL数据库,azkaban-server (web端),azkaban-executor (执行job) 1.下载 ...

  10. 泛微云桥e-Bridge安装手册

    有时候不看官方文档进行配置,可能会出现奇奇怪怪的问题,SO转载一下官方文档,顺带学习. 想超长体验此软件,请搜索本博客内容,有破解方法,仅用来学习使用,顺带进行二次开发,请勿使用在商业用途,谢谢. 泛 ...