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

时间:2022-07-26
本文章向大家介绍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的情况

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