专栏首页梅花的学习记录Shiro学习笔记 三(认证授权)

Shiro学习笔记 三(认证授权)

第一种首先基于角色的权限控制

1.由于不断的创建SecurityFactory工程等步骤重复多次,所以应该将这些步骤封装成一个工具类

还是首先看一下目录结构

主要用到文件

首先贴一下工具类的方法

package com.zuoyan.utils;

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;
/**
 * 将获取当前用户封装成一个方法,方便每次调用
 * @author zuoyan
 *
 */
public class ShiroUtil {

    /**
     * 获取当前用户  1.配置文件的位置 2.用户得账号 3.用户的密码
     * @param configFile
     * @param userName
     * @param password
     * @return
     */
    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.int配置文件中的内容

[users]
zuoyan=zuoyan123,role1,role2,role3
java1234=123456,role1,role2
jack=123,role1

还有最后就是在测试方法中调用的代码

RoleTest.java

package com.zuoyan.shiro;



import java.util.Arrays;

import org.apache.shiro.subject.Subject;
import org.junit.Test;

import com.zuoyan.utils.ShiroUtil;


public class RoleTest {

    @Test
    public void testHasRole() {
        Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "zuoyan", "zuoyan123");
        // Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123");
        System.out.println(currentUser.hasRole("role1")?"有role1这个角色":"没有role1这个角色");
        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这个角色");
        System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2"))?"role1,role2这两个角色都有":"role1,role2这个两个角色不全有");
        
        currentUser.logout();
    }

    @Test
    public void testCheckRole() {
        Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "java1234", "123456");
        // Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "jack", "123");
        currentUser.checkRole("role1");
        //这两个方法是一样的如果没有通过就会报错
        currentUser.checkRoles(Arrays.asList("role1","role2"));
        currentUser.checkRoles("role1","role2","role3");
        
        currentUser.logout();
    }
}

这种情况是认证成功的效果

如果要是用户的认证都没有通过的话,那么向下执行就会显示没有XXX这个角色

--------------------------------------------------------------下面学习授权-------------------------------------------------------------

在资源文件下创建 shiro_permission.ini

文件中的内容为:

[users]
java1234=123456,role1,role2
jack=123,role1
[roles]
role1=user:select
role2=user:add,user:update,user:delete

role1 角色只具有查找的权限 role2的角色可以进行 增 删 改

新建一个测试类,就是测试角色权限的

如下代码

package com.zuoyan.shiro;

import org.apache.shiro.subject.Subject;
import org.junit.Test;

import com.zuoyan.utils.ShiroUtil;

public class PermissionTest {
    
    @Test
    public void testIsPermitted() {
        Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java1234", "123456");
        // Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123");
        System.out.println(currentUser.isPermitted("user:select")?"有user:select这个权限":"没有user:select这个权限");
        System.out.println(currentUser.isPermitted("user:update")?"有user:update这个权限":"没有user:update这个权限");
        boolean results[]=currentUser.isPermitted("user:select","user:update","user:delete");
        System.out.println(results[0]?"有user:select这个权限":"没有user:select这个权限");
        System.out.println(results[1]?"有user:update这个权限":"没有user:update这个权限");
        System.out.println(results[2]?"有user:delete这个权限":"没有user:delete这个权限");
        System.out.println(currentUser.isPermittedAll("user:select","user:update")?"有user:select,update这两个权限":"user:select,update这两个权限不全有");
        
        currentUser.logout();
    }

    @Test
    public void testCheckPermitted() {
        Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java1234", "123456");
        // Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123");
        currentUser.checkPermission("user:select");
        currentUser.checkPermissions("user:select","user:update","user:delete");
        currentUser.logout();
    }

}

运行效果图

这次测试更换一个用户账号,权限比较小的,

判断权限的语句 :currentUser.isPermitted (参数是用户的权限)

返回值是bool类型的

使用check的情况

如果不成功 就会抛出异常! 而且没有返回值

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Hadoop 分布式部署 三:基于Hadoop 2.x 伪分布式部署进行修改配置文件】

    首先在 hadoop-senior 的这台主机上 进行 解压 hadoop2.5 按照伪分布式的配置文件来进行配置

    梅花
  • 《 动态规划_ 入门_最大连续子序列 》

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe...

    梅花
  • SpringBoot整合MyBatis

    SpringBoot2.x 中默认使用的是hikari.HikariDataSource 数据源,SpringBoot1.x 网上说使用的是TomcatDat...

    梅花
  • 一个普通数据库用户所能查到的"意料之外"的信息(r2笔记98天)

    有时候限于工作环境的情况,大多数开发人员只得到了一个权限收到限制的数据库用户。 可能你都不知道你所拥有的数据库用户都能查到哪些你想象不到的数据库信息,其实你知道...

    jeanron100
  • Java 8——行为参数化

    前言 《Java8实战》不得不说是一本好书,捧起来看起来就兴奋得不想放下,其中介绍的函数式编程实在是太令人兴奋了,不仅仅大大提高了代码的可读性,而且提高了代码的...

    我没有三颗心脏
  • Intel CEO称无人驾驶汽车2024年上路,口径不一致比自家计划晚了两年

    镁客网
  • 程序员过关斩将--快速迁移10亿级数据

    大约21亿吧,2017年以前的数据没有业务意义了,给你半天时间把这个事搞定,绩效给你A

    架构师修行之路
  • 欧洲5G研究进展:5GPPP启动第三阶段EVE、VINNI、ENESIS基础设施项目

    欧洲5G研究计划5G PPP(5G公私合作伙伴关系)正式启动了第三阶段的研究,在由To-Euro-5G项目协调员David Kennedy主持的EuCNC会议上...

    SDNLAB
  • Linux常用命令

    Linux常用命令 常用指令 ls   显示文件或目录 -l 列出文件详细信息l(list) -a ...

    Java帮帮
  • 小白博客 linux常用操作命令

    常用指令 ls   显示文件或目录      -l 列出文件详细信息l(list)      -a 列出当前目录下所有文件及目录,包括隐藏的a...

    奶糖味的代言

扫码关注云+社区

领取腾讯云代金券