Shiro的授权和Session管理(三)

简介: Shiro的授权和Session管理(三)

一. Shiro 的授权


Shiro的授权,主要是对角色和权限进行相关的验证。 注意,对角色和权限验证之前,必须要进行认证, 已经登录成功的用户才可能查询出相应的角色和权限。


首先,老蝴蝶先讲解一下角色,再讲解一下权限。


一.一 Shiro 的角色管理


一.一 .一 提供方法


Shiro 通过 subject 对象里面的方法,对角色进行判断


20200512160105571.png


image.png


一.一 .二 角色测试Demo


一.一 .二.一 创建 shiro_role.ini, 配置角色信息


# 配置用户和角色的信息
[users]
#用户名=密码,角色1,角色2,角色n
yuejl=1234,role1,role3
yuezl=1234,role2


员工yuejl 的密码是 1234, 具有的角色是 role1,role3


员工yuezl 的密码是1234, 具有的角色是 role2


一.一 .二.二 编写测试角色的Demo


角色,常见的有以下几个方面, 是否具有某一种角色,看一些角色里面有哪一些真正具有,是否具有全部的角色等判断。


package com.yjl.role;
import java.util.Arrays;
import org.apache.shiro.SecurityUtils;
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;
/**
 * 
 * @author 两个蝴蝶飞
 * Shiro 角色的测试
 */
public class RoleDemo1 {
  public static void main(String[] args) {
    //1. 创建工厂 
    Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro_role.ini");
    //2. 从工厂里面获取 SecurityManager
    SecurityManager securityManager=factory.getInstance();
    //3. 通过工具类设置 securityManager
    SecurityUtils.setSecurityManager(securityManager);
    //4. 获取当前登录的用户
    Subject subject=SecurityUtils.getSubject();
    //5. 拼装用户的身份和密码Token
    //怕乱,不注释写了,后面的程序,只改变这一个 token 代码
    UsernamePasswordToken token=new UsernamePasswordToken("yuejl","1234"); 
    //6. 调用 subject 里面的login 方法,进行登录
    try{      
      subject.login(token);
      // 登录成功之后,判断是否具有某个角色    
      boolean flag=subject.hasRole("role1");
      System.out.println(token.getUsername()+"是否具有角色 role1:"+flag);
      flag=subject.hasRole("role2");
      System.out.println(token.getUsername()+"是否具有角色 role2:"+flag);
      boolean[] flag2=subject.hasRoles(Arrays.asList("role1","role2","role3"));
      System.out.println("角色:"+Arrays.toString(flag2));
      flag=subject.hasAllRoles(Arrays.asList("role1","role2","role3"));
      System.out.println("是否具有所有的角色:"+flag);
      //可以用方法 check 进行判断
      try{
        subject.checkRole("role1");
        System.out.println("具有角色role1");
      }catch(Exception e){
        e.printStackTrace();
        System.out.println("没有角色 role1");
      }
      try{
        subject.checkRole("role2");
        System.out.println("具有角色role2");
      }catch(Exception e){
        e.printStackTrace();
        System.out.println("没有角色 role2");
      }
      try{
        subject.checkRoles(Arrays.asList("role1","role2","role3"));
        System.out.println("具有角色role1,role2,role3");
      }catch(Exception e){
        e.printStackTrace();
        System.out.println("没有角色 role1,role2,role3");
      }
      try{
        subject.checkRoles("role1","role2","role3");
        System.out.println("具有角色role1,role2,role3");
      }catch(Exception e){
        e.printStackTrace();
        System.out.println("没有角色 role1,role2,role3");
      }
    }catch (Exception e) {
            e.printStackTrace();
            System.out.println("用户名或者密码错误");
        }
  }
}


运行后,控制台打印输出:


20200512160115290.png


实际开发中,并不以角色进行相应的判断,而是以具体地权限,进行相应地判断。


一.二 Shiro 的权限管理


一.二.一 提供地权限方法


同样,是通过 subject 对象进行相应的调用 。


20200512160121723.png


image.png


在判断权限时,通常使用字符串参数的形式去判断,而不用对象参数形式。


一.二.二 编写测试权限的Demo


一.二.二.一 创建权限文件 shiro_permission.ini


# 配置用户的信息
[users]
#用户名=密码,角色1,角色2
yuejl=1234,role1,role3
yuezl=1234,role2
# 定义角色的信息, 角色,权限, *表示全部的权限
[roles]
role1=user:add,user:delete
role2:user:*
role3:user:select


这是说, role1 具有 user 的add,delete 权限,


role2 具有 user的全部权限


role3 具有 user 的select 查询权限。


一.二.二.二 权限测试小 Demo


package com.yjl.role;
import java.util.Arrays;
import org.apache.shiro.SecurityUtils;
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;
/**
 * 
 * @author 两个蝴蝶飞
 * Shiro 的第五个演示文件, 策略
 */
public class PermissionDemo {
  public static void main(String[] args) {
    //1. 创建工厂 
    Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro_permission.ini");
    //2. 从工厂里面获取 SecurityManager
    SecurityManager securityManager=factory.getInstance();
    //3. 通过工具类设置 securityManager
    SecurityUtils.setSecurityManager(securityManager);
    //4. 获取当前登录的用户
    Subject subject=SecurityUtils.getSubject();
    //5. 拼装用户的身份和密码Token
    //怕乱,不注释写了,后面的程序,只改变这一个 token 代码
    UsernamePasswordToken token=new UsernamePasswordToken("yuejl","1234"); 
    //6. 调用 subject 里面的login 方法,进行登录
    try{      
      subject.login(token);
      boolean flag=subject.isPermitted("user:add");
      System.out.println(token.getUsername()+" 是否具有权限 user:add ,"+flag);
      boolean[] flag2=subject.isPermitted("user:add","user:update","user:select","user:delete");
      System.out.println("权限:"+Arrays.toString(flag2));
      flag=subject.isPermittedAll("user:add","user:update");
      System.out.println("是否具有全部权限:"+flag);
      //也可以检查权限
      try{
        subject.checkPermission("user:add");
        System.out.println("有添加的权限");
      }catch(Exception e){
        e.printStackTrace();
        System.out.println("没有添加的此权限");
      }
      try{
        subject.checkPermissions("user:add","user:update");
        System.out.println("有添加和修改的权限");
      }catch(Exception e){
        e.printStackTrace();
        System.out.println("没有添加和修改的此权限");
      }
    }catch (Exception e) {
            e.printStackTrace();
            System.out.println("用户名或者密码错误");
        }
  }
}


控制台打印输出:


20200512160132852.png


一.二.三 权限的写法


权限的字符串规则是: 资源标识符:操作:对象实例ID,


如 user:add, user:add:1 这样的形式的。


可以用通配符进行表示。


一.二.三.一 单个资源的单个权限


如user 资源的添加权限, 可以写成: user:add


user 资源的删除权限,可以写成: user:delete


一.二.三.二 单个资源的多个权限


如user 资源的添加和删除权限, 可以写成: user:add,user:delete, 也可以写成: user:add,delete


如果想表示该实例的多个权限, 可以 user:add,delete,update,select, 也可以直接 user:*


一.二.三.三 单个实例的单个权限


需要对每一个具体的实体进行相应的判断,


如对 user 表的编号为1的那个记录的添加权限, 可以 user:add:1


如果是对user 表的那个编号为1的那个记录的删除权限, 可以为 user:delete:1


一.二.三.四 单个实例的多个权限


如对 user表编号为1的那个记录的添加和删除权限, 可以是 user:add,delete:1, 也可以是 user:add:1,user:delete:1


一.二.三.五 单个实例的全部权限


如对 user 表编号为1 的那个记录有全部的权限, 可以是 user:*:1


二. Session 管理


Shiro 也提供了对 Session 的管理, 但一般都用在 Web 端。


通过 subject 对象的 getSession() 方法来获取相应的 Session 对象。


  public abstract Session getSession();
  public abstract Session getSession(boolean paramBoolean);


getSession() 等价于 getSession(true), 表示 如果当前有session()对象,就使用,如果没有,就创建一个。


getSession(false) 表示,如果当前有session()对象,就使用,如果没有,不创建,返回false.


二.一 Session 提供的方法


20200512160141880.png


但一般都不常用。


二.二 Session 管理的Demo


package com.yjl.role;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
/**
 * 
 * @author 两个蝴蝶飞
 * Shiro 的第五个演示文件, session管理 
 */
public class SessionDemo {
  public static void main(String[] args) {
    //1. 创建工厂 
    Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro_permission.ini");
    //2. 从工厂里面获取 SecurityManager
    SecurityManager securityManager=factory.getInstance();
    //3. 通过工具类设置 securityManager
    SecurityUtils.setSecurityManager(securityManager);
    //4. 获取当前登录的用户
    Subject subject=SecurityUtils.getSubject();
    //5. 拼装用户的身份和密码Token
    //怕乱,不注释写了,后面的程序,只改变这一个 token 代码
    UsernamePasswordToken token=new UsernamePasswordToken("yuejl","1234"); 
    Session session=subject.getSession(true);
    System.out.println("获取id:"+session.getId());
    session.setAttribute("name","两个蝴蝶飞");
    String name=(String)session.getAttribute("name");
    System.out.println("输出名称:"+name);
    //6. 调用 subject 里面的login 方法,进行登录
    try{      
      subject.login(token);
    }catch (Exception e) {
            e.printStackTrace();
            System.out.println("用户名或者密码错误");
        }
  }
}


获取id 和相应的name 值。


控制台打印输出:


20200512160147744.png


本章节代码链接为:


链接:https://pan.baidu.com/s/1N-JgSwFGl4IsrBHk-R7cmw 
提取码:w8az


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
7月前
|
Java Spring
Shiro 支持三种方式的授权
Shiro 支持三种方式的授权
|
1月前
|
Java 数据安全/隐私保护
Shiro - 授权那些事
Shiro - 授权那些事
29 0
|
7月前
Shrio配置多个Realm、SecurityManager认证策略
Shrio配置多个Realm、SecurityManager认证策略
|
8月前
|
Java 数据安全/隐私保护
07 Shrio 授权的几个关键对象
07 Shrio 授权的几个关键对象
27 1
|
9月前
|
安全 前端开发 Java
基于Session方式深入了解认证授权 2
基于Session方式深入了解认证授权
32 0
|
9月前
|
Java Maven 数据安全/隐私保护
基于Session方式深入了解认证授权 1
基于Session方式深入了解认证授权
44 0
|
10月前
|
安全 Java 数据安全/隐私保护
SpringSecurity-10-Session会话管理
SpringSecurity-10-Session会话管理
89 0
|
程序员 数据库 数据安全/隐私保护
2021年你还不会Shiro?----5.使用Shiro实现授权功能
每个用户对系统的访问都会对应着身份认证,那么身份认证完了以后呢,自然就是对该用户进行授权,判断用户请求的资源是否拥有权限,或者从数据中获取该用户对应的角色,从而判断对应的资源,该用户是否可以访问。
73 0
|
Java 数据安全/隐私保护
【Shiro】1、Shiro实现登录授权认证功能(中)
之前在 SSM 项目中使用过 shiro,发现 shiro 的权限管理做的真不错,但是在 SSM 项目中的配置太繁杂了,于是这次在 SpringBoot 中使用了 shiro,下面一起看看吧
114 0
|
Java 数据安全/隐私保护
【Shiro】1、Shiro实现登录授权认证功能(下)
之前在 SSM 项目中使用过 shiro,发现 shiro 的权限管理做的真不错,但是在 SSM 项目中的配置太繁杂了,于是这次在 SpringBoot 中使用了 shiro,下面一起看看吧
105 0