Shiro笔记(五)Shiro授权
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授权的更多相关文章
- Shiro学习笔记五(Shiro标签,及通配符)
1.首先是导入标签库 <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> ...
- Shiro笔记(一)Shiro整体介绍
介绍:是一个java的安全(权限)框架 可以完成的功能:认证登录(Authentication).授权(Authorization).加密(cryptography).会话管理(session man ...
- Shiro笔记(五)JSP标签
Shiro笔记(五)JSP标签 导入标签库 <%@taglib prefix="shiro" uri="http://shiro.apache.org/tags&q ...
- Shiro笔记(三)授权
Shiro笔记(三)授权 一.授权方式 1.编程式: Subject subject=SecurityUtils.getSubject(); if(subject.hasRole("root ...
- Shiro第五篇【授权过滤、注解、JSP标签方式、与ehcache整合】
授权过滤器测试 我们的授权过滤器使用的是permissionsAuthorizationFilter来进行拦截.我们可以在application-shiro中配置filter规则 <!--商品查 ...
- Shiro 自定义登陆、授权、拦截器
Shiro 登陆.授权.拦截 按钮权限控制 一.目标 Maven+Spring+shiro 自定义登陆.授权 自定义拦截器 加载数据库资源构建拦截链 使用总结: 1.需要设计的数据库:用户.角色.权限 ...
- Shiro笔记(一)基本概念
Shiro笔记(一)基本概念 一.简介 Shiro是一个Java安全框架,可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等. Authentication:身份认证/登录,验证用户是 ...
- 32、shiro框架入门3.授权
一. 授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等).在授权中需了解的几个关键对象:主体(Subject).资源(Resource).权限(Permission ...
- Shiro笔记(四)编码/加密
Shiro笔记(四)编码/加密 一.编码和解码 //base64编码.解码 @Test public void testBase64(){ String str="tang"; b ...
- Shiro笔记(二)身份验证
Shiro笔记(二)身份验证 一.核心代码 @Test public void helloWorldTest(){ IniSecurityManagerFactory factory = new In ...
随机推荐
- input file 多张图片上传 获取地址 ——fileReader
//上传图片 $('#files').change(function(e){ var fil = this.files; var m =0; if(fil.length>3){ alert('重 ...
- Eclipse 软件 Java 解决:出现的editor does not contain a main type错误框 问题
Eclipse 软件 解决:出现的 editor does not contain a main type 错误框 问题 当你运行 Java文件是,如果弹出了下面的 错误框: 出现错误的原因: 当前的 ...
- Confluence 6 临时目录(安装目录)
temp 目录是由 Java 运行时进行配置的,同时一些 Confluence 的组件将会写入历史文件或者锁定文件到这个目录中. 临时目录位于安装目录下的 /temp 目录中. 希望修改这个目录的位置 ...
- <<人月神话>>阅读体会(一)
第一次听说人月神话还是在大一上学期的导论课那会儿,那会儿好像就已经确定了自己要学软件,于是就去问王建民老师能不能给我推荐几本软件工程方面的书,我想要提前自己学学,以为老师会给我推荐一些某种语言类的学习 ...
- Mycat节点扩缩容及高可用集群方案
数据迁移与扩容实践: 工具目前从 mycat1.6,准备工作:1.mycat 所在环境安装 mysql 客户端程序. 2.mycat 的 lib 目录下添加 mysql 的 jdbc 驱动包. 3.对 ...
- 如何编辑PDF文件,怎么使用PDF裁剪页面工具
在编辑PDF文件的时候,往往会有很多的小技巧可以使用,在编辑PDF文件的时候,怎么对文件的页面进行裁剪呢,不会的话,看看下面的文章吧,小编已经为大家整理好了哦. 1.打开运行PDF编辑器,在编辑器中打 ...
- C++ Primer 笔记——标准库类型string
1.如果使用等号初始化一个变量,实际上执行的是拷贝初始化,编译器吧等号右侧的初始值拷贝到新创建的对象中去:如果不使用等号则执行的是直接初始化. std::string str = "Test ...
- spring cloud Config--server
概述 使用Config Server,您可以在所有环境中管理应用程序的外部属性.客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同,因此它们与Spr ...
- 010-Python-socket编程
客户端/服务器的架构 物理层:网卡,光缆,双绞线 数据链路层:包含源mac地址和目标的mac地址,通过广播通讯 网络层:跑的IP协议,IP地址可以定义到一个子网:通过ARP协议可以解析为mac地址: ...
- dubbo的工作原理
dubbo工作原理 第一层:service层,接口层,给服务提供者和消费者来实现的 第二层:config层,配置层,主要是对dubbo进行各种配置的 第三层:proxy层,服务代理层,透明生成客户端的 ...