Shiro中进行角色与权限认证流程
场景
使用Shiro的JdbcRealm实现查询数据库进行身份认证:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/90105995
权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。
在权限认证中,最核心的三个要素是:权限,角色和用户;
权限,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;
角色,是权限的集合,一中角色可以包含多种权限;
用户,在Shiro 中,代表访问系统的用户,即Subject;
实现
在上面搭建项目实现了身份验证的基础上。
添加junit的依赖。
完整pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.badao.shiro</groupId><artifactId>shiroTest</artifactId><version>0.0.1-SNAPSHOT</version><name>shiroTest</name><dependencies><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.2.4</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.12</version></dependency><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
</project>
封装身份验证工具类
新建common包,包下新建ShiroUtil.java
package com.badao.shiro.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实例绑定到SecurityUtilsSecurityUtils.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;}
}
角色认证
在resource下新建shiro_role.ini配置文件
[users]
badao=123456,role1,role2
liumang=123,role1
上面的写法代表badao拥有角色role1和role2,liumang拥有角色role1
编写测试类
package com.badao.shiro;import java.util.Arrays;import org.apache.shiro.subject.Subject;
import org.junit.Test;import com.badao.shiro.common.ShiroUtil;public class RoleTest {@Testpublic void testHasRole() {Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "badao", "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();}@Testpublic void testCheckRole() {Subject currentUser=ShiroUtil.login("classpath:shiro_role.ini", "badao", "123");//checkRole没有返回值 验证不成功会报异常currentUser.checkRole("role1");currentUser.checkRoles(Arrays.asList("role1","role2"));currentUser.checkRoles("role1","role2","role3");currentUser.logout();}}
运行结果
testHasRole:
testCheckRole:
权限验证
编写权限验证配置文件
resource下新建shiro_permission.ini
[users]
badao=123,role1,role2
liumang=456,role1
[roles]
role1=user:select
role2=user:add,user:update,user:delete
已上配置表明role1有select权限,role2有add、update、delete权限。
编写单元测试类
package com.badao.shiro;import org.apache.shiro.subject.Subject;
import org.junit.Test;import com.badao.shiro.common.ShiroUtil;public class PermissionTest {@Testpublic void testIsPermitted() {Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "badao", "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();}@Testpublic void testCheckPermitted() {Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "badao", "123");currentUser.checkPermission("user:select");currentUser.checkPermissions("user:select","user:update","user:delete");currentUser.logout();}}
效果:
testIsPermitted
testCheckPermitted
源码下载
https://download.csdn.net/download/badao_liumang_qizhi/11173045
Shiro中进行角色与权限认证流程相关推荐
- AspNetForums中基于角色的权限控制
AspNetForums中基于角色的权限控制 http://blog.joycode.com/dotey/archive/2005/02/24/44791.aspx asp.net页面如何控制页面依据 ...
- 实战:k8s中基于角色的权限访问控制-RBAC(成功测试-博客输出)-20211005
目录 文章目录 目录 写在前面 基础知识介绍 实验环境 实验软件 老师原课件内容 1..用K8S CA签发客户端证书 2. 生成kubeconfig授权文件 3. 创建RBAC权限策略 4.指定kub ...
- Jenkins 中基于角色的权限管理
Jenkins 中基于角色的权限管理 原文地址: Jenkins 中基于角色的权限管理 | 超级小豆丁 (mydlq.club) 系统环境: Jenkins 版本:2.213 一.简介 Jenkins ...
- Shiro基础应用——角色和权限校验
一.Shiro 为什么要用shiro: 1.项目中的密码是否可以明文存储? 2.是否任意访客,无论是否登录都可以访问任何功能? 3.项目中的各种功能操作,是否是所有用户都可以随意使用? 综上,当项目中 ...
- shiro中的验证用户身份认证以及授权
目录 1.运用shiro进行用户身份认证: 1.1导入基于Shiro的数据库脚本 1.2.引入依赖(shiro-1.4.1) shiro-core shiro-web shiro-spring 1 ...
- Moodle中的角色与权限控制
有关角色的概念: 角色是权限访问的集合,用于在魔灯中管理者可以在特定情境下委派特定的权限给特定的用户. 例如,您可能有一个"教师"的角色,这个角色允许教师完成一些特定的功能(而不是 ...
- jenkins组权限_Jenkins 中基于角色的权限管理
!版权声明:本博客内容均均为原创,每篇博文作为知识积累,写博不易,转载请注明出处. 目录[-] 系统环境: Jenkins 版本:2.213 一.简介 Jenkins 一般应用于项目构建与持续集成中, ...
- oracle 授予 sequence,Oracle中的角色和权限授予
Oracle为了兼容以前的版本,提供了三种标准的角色(role):connect.resource和dba. 1. connect role(连接角色) 临时用户,特别是那些不需要建表的用户,通常只赋 ...
- 详解比springSecurity和shiro更简单优雅的轻量级Sa-Token框架,比如登录认证,权限认证,单点登录,OAuth2.0,分布式Session会话,微服务网关鉴权
文章目录 1. 技术选型 2. Sa-Token概述 2.1 简单介绍 2.2 登录认证 2.3 权限认证 3. 功能一览 4. Sa-Token使用 4.1 引入Sa-Token依赖 4.2 Sa- ...
最新文章
- 计算机基础知识与基本操作文档,计算机基础知识与基本操作——图文混排课件...
- mysql select into和insert into select
- 语音编解码技术演进和应用选型
- Flink进行Kafka事实表与Mysql维度表Join(纯DDL/DML方式)
- 在statspack显示完整的SQL
- mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
- hadoop--集群时间同步(可不同步)
- eureka server配置_程序员笔记|详解Eureka 缓存机制
- Eclipse调试时出现source not found的问题
- 关于自然排序Comparable 和 比较器排序Comparator
- 123.static静态函数和函数模板
- 微服务(Microservices)概述 与 Spring Cloud 简介
- Python获取对象所占内存大小方法
- Unity简单爆炸效果的实现
- read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was
- 系统思考:智猪博弈(变革)
- 什么软件测试固态硬盘坏没坏,固态硬盘容易坏吗 SSD固态硬盘坏掉前有什么征兆【详细介绍】...
- 360 os3.0 android7.1,360手机N5s发布:升级基于安卓7.1的360 OS 2.0系统
- 创意名片大全:一组精美的折叠效果名片设计
- office 2003也能编辑.docx文档
热门文章
- python周志_Python学习周志—第一周(入门知识)
- yii 全选 php,Yii2.0实现的批量更新及批量插入功能示例
- ecu故障现象_【案例】柴油电喷车维修故障案例
- ios 上运行linux,你可曾想过在iOS上跑Linux?
- python的seaborn下载_Python可视化 | Seaborn包—heatmap()
- python获取系统时间函数_Python常用时间操作总结【取得当前时间、时间函数、应用等】...
- mysql常见面试题
- python做动态相册_动感网页相册 python编写简单文件夹内图片浏览工具
- python语言编写的modbus协议_RTU Modbus从机的python脚本
- c# 基于layui的通用后台管理系统_【SpringBoot】三十三、SpringBoot+LayUI后台管理系统开发脚手架...