【Shiro】Apache Shiro架构之权限认证(Authorization)
Shiro系列文章:
【Shiro】Apache Shiro架构之身份认证(Authentication)
【Shiro】Apache Shiro架构之集成web
【Shiro】Apache Shiro架构之自定义realm
【Shiro】Apache Shiro架构之实际运用(整合到Spring中)
上一篇博文总结了一下Shiro中的身份认证,本文主要来总结一下Shiro中的权限认证(Authorization)功能,即授权。如下:
本文参考自Apache Shiro的官方文档:http://shiro.apache.org/authorization.html。
本文遵循以下流程:先介绍Shiro中的权限认证,再通过一个简单的实例来具体说明一下API的使用(基于maven)。
1. 权限认证的核心要素
权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。在权限认证中,最核心的三个要素是:权限,角色和用户:
权限(permission):即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;
角色(role):指的是用户担任的的角色,一个角色可以有多个权限;
用户(user):在Shiro 中,代表访问系统的用户,即上一篇博文提到的Subject认证主体。
它们之间的的关系可以用下图来表示:
一个用户可以有多个角色,而不同的角色可以有不同的权限,也可由有相同的权限。比如说现在有三个角色,1是普通角色,2也是普通角色,3是管理员,角色1只能查看信息,角色2只能添加信息,管理员都可以,而且还可以删除信息,类似于这样。
2.1 基于角色的访问控制
也就是说,授权过程是通过判断角色来完成的,哪个角色可以做这件事,哪些角色可以做这件事等等。它有如下API:
| 方法 | 作用 |
| hasRole(String roleName) | 判断是否有该角色访问权,返回boolen |
| hasRoles(List<String> roleNames) | 判断是否有这些这些角色访问权,返回boolean[] |
| hasAllRoles(Collection<String> roleNames) | 判断是否有这些这些角色访问权,返回boolean |
对这三个API,做一下简单的说明,第一个很简单,传入一个role即可,判断是否拥有该角色访问权,第二个方法是传入一个role的集合,然后Shiro会根据集合中的每一个role做一下判断,并且将每次的判断结果放到boolean[]数组中,顺序与集合中role的顺序一致;第三个方法也是传入一个role的集合,不同的是,返回boolean类型,必须集合中全部role都有才为true,否则为false。
用法如下:
Subject currentUser = SecurityUtils.getSubject();
if (currentUser.hasRole("administrator")) {
//show the admin button or do administrator's things
} else {
//don't show the button? Grey it out? or others...
}
除了这三个API外,Shiro还提供了check的API,与上面不同的是,has-xxx会返回boolean类型的数据,用来判断,而check-xxx不会返回任何东西,如果验证成功就继续处理下面的代码,否则会抛出一个异常,可以用来通过捕获异常来处理。API如下:
| 方法 | 作用 |
|---|---|
checkRole(String roleName) |
如果判断失败抛出AuthorizationException异常 |
checkRoles(String... roleNames) |
如果判断失败抛出AuthorizationException异常 |
checkRoles(Collection<String> roleNames) |
如果判断失败抛出AuthorizationException异常 |
类似的使用方法如下:
Subject currentUser = SecurityUtils.getSubject();
//guarantee that the current user is a bank teller and
//therefore allowed to open the account:
currentUser.checkRole("bankTeller");
openBankAccount();
2.2 基于权限的访问控制
基于权限的访问控制和基于角色的访问控制在原理上是一模一样的,只不过API不同而已,我不再做过多的解释,API如下:
| 方法 | 作用 |
|---|---|
isPermitted(String perm) |
判断是否有该权限,返回boolen |
isPermitted(List<String> perms) |
判断是否有这些这些权限,返回boolean[] |
isPermittedAll(Collection<String> perms) |
判断是否有这些这些权限,返回boolean |
checkPermission(String perm) |
如果判断失败抛出AuthorizationException异常 |
checkPermissions(String... perms) |
如果判断失败抛出AuthorizationException异常 |
checkPermissionsAll(Collection<String> perms) |
如果判断失败抛出AuthorizationException异常 |
3. 权限认证示例代码
不管是身份认证还是权限认证,首先都需要创建SecurityManager工厂,SecurityManager,所以首先新建一个工具类专门做这个事情。
public class ShiroUtil {
public static Subject login(String configFile, String username,
String password) {
// 读取配置文件,初始化SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(configFile);
// 获取securityManager实例
SecurityManager securityManager = factory.getInstance();
// 把securityManager实例绑定到SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
// 得到当前执行的用户
Subject currentUser = SecurityUtils.getSubject();
// 创建token令牌,用户名/密码
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try{
// 身份认证
currentUser.login(token);
System.out.println("身份认证成功!");
}catch(AuthenticationException e){
e.printStackTrace();
System.out.println("身份认证失败!");
}
return currentUser;
}
}
提供一个静态方法,返回当前用户,在应用程序中我们直接调用这个类中的静态方法即可返回当前认证的用户了。
maven中的pom.xml文件内容和上一节一样的,不再赘述。
Shiro的配置文件shiro.ini:
#用户,role表示各个角色
[users]
csdn1=123,role1,role2,role3
csdn2=123,role1,role2 #定义不同角色都拥有哪些权限
[roles]
role1=user:select
role2=user:add,user:update
role3=user.delete
角色认证:
public class RoleTest {
@Test
public void testHasRole() {
String configFile = "classpath:shiro.ini";
String username = "csdn2";
String password = "123";
Subject currentUser = ShiroUtil.login(configFile, username, password);
//测试hasRole
System.out.println(currentUser.hasRole("role2")? "有role2这个角色" : "没有role2这个角色");
//测试hasRoles
boolean[] results = currentUser.hasRoles(Arrays.asList("role1","role2","role3"));
System.out.println(results[0]? "有role1这个角色" : "没有role1这个角色");
System.out.println(results[1]? "有role2这个角色" : "没有role2这个角色");
System.out.println(results[2]? "有role3这个角色" : "没有role3这个角色");
//测试hasAllRoles System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2","role3")));
currentUser.logout();
}
@Test
public void testCheckRole() {
String configFile = "classpath:shiro.ini";
String username = "csdn2";
String password = "123";
Subject currentUser = ShiroUtil.login(configFile, username, password);
// currentUser.checkRole("role3");//没有返回值。有就不报错,没有就会报错
// currentUser.checkRoles(Arrays.asList("role1","role2","role3")); //同上
currentUser.checkRoles(Arrays.asList("role1","role2")); //同上
currentUser.logout();
}
}
@test可以导入junit包 然后在方法名上 run as junit 运行绿色通过就好
【Shiro】Apache Shiro架构之权限认证(Authorization)的更多相关文章
- Apache Shiro(一)-登录认证和权限管理初识
What is Apache Shiro? Apache Shiro是一个功能强大.灵活的,开源的安全框架.它可以干净利落地处理身份验证.授权.企业会话管理和加密. Apache Shiro的首要目标 ...
- 【Shiro】Apache Shiro架构之身份认证(Authentication)
Shiro系列文章: [Shiro]Apache Shiro架构之权限认证(Authorization) [Shiro]Apache Shiro架构之集成web [Shiro]Apache Shiro ...
- 【Shiro】Apache Shiro架构之自定义realm
[Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之权限认证(Authorization) [Shiro]Apache S ...
- 【Shiro】Apache Shiro架构之集成web
Shiro系列文章: [Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之权限认证(Authorization) [Shi ...
- Apache Shiro 使用手册(一)Shiro架构介绍 - kdboy - ITeye技术网站
转载 原文地址 http://kdboy.iteye.com/blog/1154644 一.什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理 ...
- Apache Shiro 使用手册(一)Shiro架构介绍
一.什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户"登录": 授权 - ...
- Apache Shiro 使用手册(一)Shiro架构介绍(转发:http://kdboy.iteye.com/blog/1154644#bc2399255)
一.什么是Shiro Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户“登录”: 授权 - 访问控制: 密码加密 ...
- SpringBoot学习:整合shiro(身份认证和权限认证),使用EhCache缓存
项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)在pom.xml中添加依赖: <properties> <shi ...
- CVE-2020-17523:Apache Shiro身份认证绕过漏洞分析
0x01 Apache Shiro Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. 0x02 漏洞简介 2021年2月1日,Apache Shiro官 ...
随机推荐
- STL的常用用法、函数汇总(不定时更新)
隶书文字为原创. 1.vector 在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vec ...
- 将json字符串转换成list<T>
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Se ...
- 8VC Venture Cup 2016 - Elimination Round G. Raffles 线段树
G. Raffles 题目连接: http://www.codeforces.com/contest/626/problem/G Description Johnny is at a carnival ...
- [转载]memcached 命令操作详解
转载:http://www.cnblogs.com/azheng007/p/3159345.html 一.存储命令 存储命令的格式: <command name> <key> ...
- Ajax同步异步的区别
1,什么是Ajax Ajax: asynchronous javascript and xml (异步javascript和xml) 其是可以与服务器进行(异步/同步)交互的技术之一. Aja ...
- HDU 3360 National Treasures(二分匹配,最小点覆盖)
National Treasures Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- [Android实例] 最全的Android开发资源整理--进阶必备
本帖最后由 一切随枫 于 2014-6-9 12:08 编辑 原文链接: http://stormzhang.github.io/android/2014/06/05/android-awesome- ...
- sso 自动化运维平台
单点登录SSO(Single Sign-On)是身份管理中的一部分.本文中作者开发了一个自动化运维平台中的统一认证接口,单点登录平台通过提供统一的认证平台,实现单点登录.因此,应用系统并不需要开发用户 ...
- 面经 | 我是如何通过校招拿到京东的Offer的
本文来自粉丝投稿,原作者:红鼻子熊. 版权归Hollis所有. OFFER:京东2018校招物流研发岗 个人:211小硕 面试时间:2017年秋天 整体:三轮面试,前两轮为技术面试,最后为hr面试 一 ...
- B. Suffix Structures 模拟吧,情况比較多要想周全
这道题须要考虑的情况比較多,flag1表示情况是:b数组里有的字母而a里没有和b里面的同一个字母个数比a里面的多 flag2表示情况:b里面的左右字母能不能在a中同等顺序的存在 flag3表示情况:a ...