Shiro-权限认证(授权)-编程式授权
权限认证
权限认证也就是访问控制,即在应用中控制谁能访问哪些资源
权限认证核心要素
- 权限 : 即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利
- 角色 : 是权限的集合,一种角色可以包含多种权限
- 用户 : 在 Shiro 中,代表访问系统的用户,即Subject
授权方式
- 编程式授权
- 基于角色的访问控制
- 基于权限的访问控制
- 注解式授权
- Jsp 标签授权
编程式授权实现
抽取公共代码生成 ShiroUtil
package com.zhen.common; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory; 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;
} }
基于角色的访问控制
- 新建 shiro_role.ini文件,两个用户,两种角色
[users]
zhen=123,role1,role2
jack=jack,role1 - 新建测试类
package com.zhen.shiro; import java.util.ArrayList;
import java.util.List;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
import com.zhen.common.ShiroUtil;
import junit.framework.TestCase; //基于角色的
public class RoleTest extends TestCase { @Test
public void testHasRole(){
String configFile = "classpath:shiro_role.ini";
String userName = "jack";
String password = "jack";
Subject currentUser = ShiroUtil.login(configFile, userName, password);
if (currentUser.hasRole("role2")) {
System.out.println(userName+"有 role2 权限");
}else{
System.out.println(userName+"没有 role2 权限");
}
currentUser.logout();
} @Test
public void testHasRoles(){
String configFile = "classpath:shiro_role.ini";
String userName = "jack";
String password = "jack";
Subject currentUser = ShiroUtil.login(configFile, userName, password);
List<String> roles = new ArrayList<String>();
roles.add("role1");
roles.add("role2"); //返回一个boolean数组
boolean[] results = currentUser.hasRoles(roles);
for (int i = 0; i < results.length; i++) {
if(results[i]){
System.out.println(userName+"有 "+roles.get(i)+" 权限");
}else{
System.out.println(userName+"没有 "+roles.get(i)+" 权限");
}
}
currentUser.logout();
} @Test
public void testHasAllRoles(){
String configFile = "classpath:shiro_role.ini";
String userName = "zhen";
String password = "123";
Subject currentUser = ShiroUtil.login(configFile, userName, password);
List<String> roles = new ArrayList<String>();
roles.add("role1");
roles.add("role2"); //是否拥有所有权限
boolean result = currentUser.hasAllRoles(roles);
if(result){
System.out.println(userName+"有 所有权限");
}else{
System.out.println(userName+"没有 所有权限");
}
currentUser.logout();
} @Test
public void testCheckRoles(){
//check 没有返回值,没有该权限的话就会抛异常
String configFile = "classpath:shiro_role.ini";
String userName = "jack";
String password = "jack";
Subject currentUser = ShiroUtil.login(configFile, userName, password);
List<String> roles = new ArrayList<String>();
roles.add("role1");
roles.add("role2");
currentUser.checkRole(roles.get(1));
currentUser.logout();
} }
基于权限的访问控制
- 新建 Shiro_permission.ini文件,内容如下:
[users]
zhen=123,role1,role2
jack=jack,role1
[roles]
role1=user:select
role2=user:add,user:update,user:deleterole1 对应有 user:select 权限
role2 对应有 user:add , user:update , user:delete 权限 - 新建测试类,代码如下:
package com.zhen.shiro; import org.apache.shiro.subject.Subject;
import org.junit.Test; import com.zhen.common.ShiroUtil; import junit.framework.TestCase; //基于权限的
public class PermissionTest extends TestCase { @Test
public void testIsPermission(){
String configFile = "classpath:shiro_permission.ini";
String userName = "zhen";
String password = "123";
Subject currentUser = ShiroUtil.login(configFile, userName, password);
System.out.println(currentUser.isPermitted("user:add")?"有add权限":"没有add权限");
System.out.println(currentUser.isPermitted("user:select")?"有select权限":"没有select权限");
boolean[] results = currentUser.isPermitted("user:add","user:select");
System.out.println(results[0]?"有add权限":"没有add权限");
System.out.println(results[1]?"有select权限":"没有select权限");
System.out.println(currentUser.isPermittedAll("user:add","user:select")?"有user:add&user:select权限":"user:add&user:select权限不全有");
currentUser.logout();
} @Test
public void testCheckPermission(){
String configFile = "classpath:shiro_permission.ini";
String userName = "zhen";
String password = "123";
Subject currentUser = ShiroUtil.login(configFile, userName, password);
currentUser.checkPermission("user:add");
currentUser.checkPermission("user:select");
currentUser.checkPermissions("user:add","user:select");
currentUser.logout();
} }
Shiro-权限认证(授权)-编程式授权的更多相关文章
- Apache shiro 笔记整理之编程式授权
下面内容是在看了涛哥的<跟我一起学shiro> 和 视频<一头扎入进shiro> 后整理出来备忘和方便自己和其它人学习. 个人主页:http://www.itit123.cn/ ...
- Shiro基础知识03----shiro授权(编程式授权),Permission详解,授权流程(zz)
授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等). 在权限认证中,最核心的是:主体/用户(Subject).权限(Permission).角色(Role).资源 ...
- Shiro入门之一 -------- Shiro权限认证与授权
一 将Shirojar包导入web项目 二 在web.xml中配置shiro代理过滤器 注意: 该过滤器需要配置在struts2过滤器之前 <!-- 配置Shiro的代理过滤器 --> ...
- shiro权限认证与授权
什么是shiro? Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架. 为什么要用sh ...
- (转)shiro权限框架详解05-shiro授权
http://blog.csdn.net/facekbook/article/details/54910606 本文介绍 授权流程 授权方式 授权测试 自定义授权realm 授权流程 开始构造Secu ...
- 学习Spring Boot:(十三)配置 Shiro 权限认证
经过前面学习 Apache Shiro ,现在结合 Spring Boot 使用在项目里,进行相关配置. 正文 添加依赖 在 pom.xml 文件中添加 shiro-spring 的依赖: <d ...
- shiro权限认证Realm的四大用法
一.SimpleAccountRealm public class AuthenticationTest { SimpleAccountRealm sar=new SimpleAcc ...
- springboot+mybatis+shiro——登录认证和权限控制
转载:https://z77z.oschina.io/ 一.引入依赖 shiro-all包含shiro所有的包.shiro-core是核心包.shiro-web是与web整合.shiro-spring ...
- spring-boot整合shiro作权限认证
spring-shiro属于轻量级权限框架,即使spring-security更新换代,市场上大多数企业还是选择shiro 废话不多说 引入pom文件 <!--shiro集成spring--& ...
随机推荐
- is_callable — 检测参数是否为合法的可调用结构
说明 bool is_callable ( callable $name [, bool $syntax_only = false [, string &$callable_name ]] ) ...
- YUV图像合成原理
http://blog.csdn.net/zwz1984/article/details/50403150 http://zhongcong386.blog.163.com/blog/static/1 ...
- JFinal中json的使用
之前Java开发一直使用的是经典的ssh,去年接触了jfinal,觉得jfinal的魅力非常之大,让我无法自拔,现在还深深地陷在其中. 简单的介绍一下jfinal,jfinal短小精悍,让java有了 ...
- FILE 创建
public class CreateDelFileUtils implements Serializable{ /** * */ private static final long serialVe ...
- 【数据挖掘】分类之decision tree(转载)
[数据挖掘]分类之decision tree. 1. ID3 算法 ID3 算法是一种典型的决策树(decision tree)算法,C4.5, CART都是在其基础上发展而来.决策树的叶子节点表示类 ...
- 华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大!
华为nova3超级慢动作酷玩抖音,没有办法我就是这么强大! 在华为最新发布的nova 3手机上,抖音通过华为himedia SDK集成了60fps.超级慢动作等华为媒体开放能力,在加持这些能力后,抖音 ...
- 【ubantu】在Ubuntu上安装tar.gz,tar.bz以及deb文件(例:libreoffice安装)
参考文章: https://blog.csdn.net/zhuquan945/article/details/52986712 ==================================== ...
- ActiveMQ与xml rpc
最近项目在做平台间的消息传递,也让我对平台间消息的传递进行了深一步的探讨.先叙述一下概况 公司上一个版本用的是winform做的监控软件,主要做设备的通信和控制,基本的连接如下
- php != 和 !== 的区别
== and != do not take into account the data type of the variables you compare. So these would all re ...
- 读书笔记-HBase in Action-第三部分应用-(1)OpenTSDB
OpenTSDB是基于HBase的开源监控系统,能够支持上万规模集群监控和上亿数据点採集. 当中TSDB代表Time Series Database,OpenTSDB在时间序列数据的存储和查询上都做了 ...