权限认证

权限认证也就是访问控制,即在应用中控制谁能访问哪些资源

权限认证核心要素

  • 权限 : 即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利
  • 角色 : 是权限的集合,一种角色可以包含多种权限
  • 用户 : 在 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:delete

    role1 对应有 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-权限认证(授权)-编程式授权的更多相关文章

  1. Apache shiro 笔记整理之编程式授权

    下面内容是在看了涛哥的<跟我一起学shiro> 和 视频<一头扎入进shiro> 后整理出来备忘和方便自己和其它人学习. 个人主页:http://www.itit123.cn/ ...

  2. Shiro基础知识03----shiro授权(编程式授权),Permission详解,授权流程(zz)

    授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等).  在权限认证中,最核心的是:主体/用户(Subject).权限(Permission).角色(Role).资源 ...

  3. Shiro入门之一 -------- Shiro权限认证与授权

    一  将Shirojar包导入web项目 二 在web.xml中配置shiro代理过滤器 注意: 该过滤器需要配置在struts2过滤器之前 <!-- 配置Shiro的代理过滤器 -->  ...

  4. shiro权限认证与授权

    什么是shiro? Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架. 为什么要用sh ...

  5. (转)shiro权限框架详解05-shiro授权

    http://blog.csdn.net/facekbook/article/details/54910606 本文介绍 授权流程 授权方式 授权测试 自定义授权realm 授权流程 开始构造Secu ...

  6. 学习Spring Boot:(十三)配置 Shiro 权限认证

    经过前面学习 Apache Shiro ,现在结合 Spring Boot 使用在项目里,进行相关配置. 正文 添加依赖 在 pom.xml 文件中添加 shiro-spring 的依赖: <d ...

  7. shiro权限认证Realm的四大用法

    一.SimpleAccountRealm public class AuthenticationTest {          SimpleAccountRealm sar=new SimpleAcc ...

  8. springboot+mybatis+shiro——登录认证和权限控制

    转载:https://z77z.oschina.io/ 一.引入依赖 shiro-all包含shiro所有的包.shiro-core是核心包.shiro-web是与web整合.shiro-spring ...

  9. spring-boot整合shiro作权限认证

    spring-shiro属于轻量级权限框架,即使spring-security更新换代,市场上大多数企业还是选择shiro 废话不多说  引入pom文件 <!--shiro集成spring--& ...

随机推荐

  1. linux 登陆key生成

    1.登录A机器 2.ssh-keygen -t rsa,将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub Generating public/priv ...

  2. java.long中的类和方法

    java.lang.Character.isUpperCase(char ch) 确定指定的字符是否为大写字符. java.lang.Character.toUpperCase()方法用法转换从Uni ...

  3. YUV图像合成原理

    http://blog.csdn.net/zwz1984/article/details/50403150 http://zhongcong386.blog.163.com/blog/static/1 ...

  4. [Java]事件驱动程序设计

    事件驱动模型三大要素 1)事件源:能接收外部事件的源体: 2)监听器xListener:能接收事件源通知的对象: 3)处理器Handler:用于处理事件的对象. 在Java中使用监听器对象处理事件的方 ...

  5. linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现

    1 TCP简介 tcp是一种基于流的应用层协议,其“可靠的数据传输”实现的原理就是,“拥塞控制”的滑动窗口机制,该机制包含的算法主要有“慢启动”,“拥塞避免”,“快速重传”. 2 TCP socket ...

  6. sersync简介与测试报告

    在分布式应用中会遇到一个问题,就是多个服务器间的文件如何能始终保持一致.一种经典的办法是将需要保持一致的文件存储在NFS上,这种方法虽然简单方便但却将本来多点的应用在文件存储上又变成了单点,这违背了分 ...

  7. Android备份和添加短信

    手机发送成功的,没有成功的,接受的短信都存放在手机自带的数据库中. 现在想要备份一下这个短信,需要访问这个数据库,然后查询所有的短信.就需要内容提供者(短信). 首先要找到内容提供者的uri.

  8. UIWebView的全屏截图

    项目开发中,我们可能会遇到如下的应用场景:将一篇文章,进行截屏(需要全屏截取,包括滚动部分)后,分享到新浪微博.邮箱等等.前段时间,我在应用开发中实现了该功能,代码也是从网上找到的,自己整理了一下.主 ...

  9. 解决Command "laravoole" is not defined.

    版权声明:本文为博主原创文章,未经博主允许不得转载.  GitHub地址:https://github.com/garveen/laravoole 先来执行正常的安装流程: 安装 要开始,将larav ...

  10. ASIHTTPRequest中文入门教程全集 http://www.zpluz.com/thread-3284-1-1.html

    本文转载至 目录  3 第  1  章  创建和运行请求  5 1.1.  创建一个同步请求  5 1.2.  创建一个异步请求  5 1.3.  使用程序块(blocks )  6 1.4.  使用 ...