前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shiro学习笔记 三(认证授权)

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

作者头像
梅花
发布2020-09-28 16:02:58
3620
发布2020-09-28 16:02:58
举报
文章被收录于专栏:梅花的学习记录

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

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

还是首先看一下目录结构

主要用到文件

首先贴一下工具类的方法

代码语言:javascript
复制
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配置文件中的内容

代码语言:javascript
复制
[users]
zuoyan=zuoyan123,role1,role2,role3
java1234=123456,role1,role2
jack=123,role1

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

RoleTest.java

代码语言:javascript
复制
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

文件中的内容为:

代码语言:javascript
复制
[users]
java1234=123456,role1,role2
jack=123,role1
[roles]
role1=user:select
role2=user:add,user:update,user:delete

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

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

如下代码

代码语言:javascript
复制
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的情况

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-11-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档