Apache Shiro 权限框架

Apache Shiro权限框架实战精讲与项目案例深入解析 Shiro的核心组件包括SubjectRealm和。Shiro的接口定义了缓存管理的基本操作。开发者可以通过实现这个接口来创建自定义的缓存管理器。 阅读详情

1.Shiro 

  Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序,可以和Spring无缝结合.关键步骤需要开发实现.

2.主要功能 

Authentication   认证

Authorization   授权

Cryptography   加密

Session Management   Session 管理

Web Integration   Web集成

Integrations  和其他集成

  三个核心组件:Subject, SecurityManager 和 Realms[域].
  Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,可以把它认为是Shiro的“用户”概念。
  Subject:代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作,Current User。
  SecurityManager:它是Shiro框架的核心,管理所有的Subject
  Realm:Access your security data, Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
  从这个意义上讲,Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。
  Shiro内置了可以连接大量安全数据源(又名目录)的Realm,如LDAP、关系数据库(JDBC)、类似ini的文本配置资源以及属性文件等。如果缺省的Realm不能满足需求,你还可以插入代表自定义数据源的自己的Realm。【百度百科】
 
3.POM.xml
复制代码
<!-- 添加Apache Shiro 依赖关系 -->
<dependency>  
        <groupId>org.apache.shiro</groupId>  
        <artifactId>shiro-core</artifactId>  
        <version>1.2.2</version>  
 </dependency>  
复制代码

4.授权  

  也叫访问控制,在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。

5.主体【Subject】

  主体,即访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才允许访问相应的资源。

6.资源【Resource】

  在应用中用户可以访问的任何东西,比如访问JSP页面、查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。用户只要授权后才能访问。

7.权限

  安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源,如:

  访问用户列表页面

  查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控制)

  打印文档等等。。。

  如上可以看出,权限代表了用户有没有操作某个资源的权利,即反映在某个资源上的操作允不允许,不反映谁去执行这个操作。所以后续还需要把权限赋予给用户,即定义哪个用户允许在某个资源上做什么操作(权限),Shiro不会去做这件事情,而是由实现人员提供。

8.角色【Role】

  角色代表了操作集合,可以理解为权限的集合,一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便。典型的如:项目经理、技术总监、CTO、开发工程师等都是角色,不同的角色拥有一组不同的权限。

  隐式角色:

  显式角色:

    请baidu搜索“RBAC”和“RBAC新解”分别了解“基于角色的访问控制”“基于资源的访问控制(Resource-Based Access Control)”。

9.Shiro 授权方式

  Shiro支持三种方式授权

  (1)编程式

复制代码
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {  
    //有权限  
} else {  
    //无权限  
}   
复制代码

  (2)注解式:通过在执行的Java方法上放置相应的注解完成,没有权限将抛出相应的异常;

@RequiresRoles("admin")  
public void hello() {  
    //有权限  
}   

  (3)JSP/GSP标签:在JSP/GSP页面通过相应的标签完成

<shiro:hasRole name="admin">  
<!— 有权限 —>  
</shiro:hasRole>   

授权

  (1)基于角色的访问控制(隐式角色)

    在ini配置文件配置用户拥有的角色(shiro-role.ini) 

[users]  
zhang=123,role1,role2  
wang=123,role1 

  规则即:“用户名=密码,角色1,角色2”,如果需要在应用中判断用户是否有相应角色,就需要在相应的Realm中返回角色信息,也就是说Shiro不负责维护用户-角色信息,需要应用提供,Shiro只是提供相应的接口方便验证

  测试用例

复制代码
@Test  
public void testHasRole() {  
    login("classpath:shiro-role.ini", "zhang", "123");  
    //判断拥有角色:role1  
    Assert.assertTrue(subject().hasRole("role1"));  
    //判断拥有角色:role1 and role2  
    Assert.assertTrue(subject().hasAllRoles(Arrays.asList("role1", "role2")));  
    //判断拥有角色:role1 and role2 and !role3  
    boolean[] result = subject().hasRoles(Arrays.asList("role1", "role2", "role3"));  
    Assert.assertEquals(true, result[0]);  
    Assert.assertEquals(true, result[1]);  
    Assert.assertEquals(false, result[2]);  
}   
复制代码

  Shiro提供了hasRole/hasRole用于判断用户是否拥有某个角色/某些权限;但是没有提供如hashAnyRole用于判断是否有某些权限中的某一个。  

复制代码
@Test(expected = UnauthorizedException.class)  
public void testCheckRole() {  
    login("classpath:shiro-role.ini", "zhang", "123");  
    //断言拥有角色:role1  
    subject().checkRole("role1");  
    //断言拥有角色:role1 and role3 失败抛出异常  
    subject().checkRoles("role1", "role3");  
}   
复制代码

(2)基于资源的访问控制(显式角色)

  在ini配置文件配置用户拥有的角色及角色-权限关系(shiro-permission.ini)

复制代码
[users]  
zhang=123,role1,role2  
wang=123,role1  
[roles]  
role1=user:create,user:update  
role2=user:create,user:delete   
复制代码

  规则:“用户名=密码,角色1,角色2”“角色=权限1,权限2”,即首先根据用户名找到角色,然后根据角色再找到权限;即角色是权限集合;Shiro同样不进行权限的维护,需要我们通过Realm返回相应的权限信息。只需要维护“用户——角色”之间的关系即可。

  测试用例

复制代码
@Test  
public void testIsPermitted() {  
    login("classpath:shiro-permission.ini", "zhang", "123");  
    //判断拥有权限:user:create  
    Assert.assertTrue(subject().isPermitted("user:create"));  
    //判断拥有权限:user:update and user:delete  
    Assert.assertTrue(subject().isPermittedAll("user:update", "user:delete"));  
    //判断没有权限:user:view  
    Assert.assertFalse(subject().isPermitted("user:view"));  
}   
复制代码
复制代码
@Test(expected = UnauthorizedException.class)  
public void testCheckPermission () {  
    login("classpath:shiro-permission.ini", "zhang", "123");  
    //断言拥有权限:user:create  
    subject().checkPermission("user:create");  
    //断言拥有权限:user:delete and user:update  
    subject().checkPermissions("user:delete", "user:update");  
    //断言拥有权限:user:view 失败抛出异常  
    subject().checkPermissions("user:view");  
}   
复制代码

  失败的情况下会抛出 UnauthorizedException 异常.

  Subject subject = SecurityUtils.getSubject();

案例笔记:

 

权限数据库设计(PS:尽量不要涉及外键,管理起来有时候会比较麻烦):

表:User(用户) Role(角色) UserRole(用户角色对应关系) Resource(资源) RoleResource(角色资源)

复制代码
User(id username userpwd nickname status)   //status标注用户账号是否停用或者被锁定;

Role(id name)

Resource(id name permission url)

RoleResource(id roleId resId)

UserRole(id userId roleId)
复制代码

Dao设计:继承IBaseDao

IuserDao: 用户接口

public list<User> listAllUsers();//查询所有用户

public list<User> listUsersByRole(int roleId);//根据角色取出所有用户

public User loadByUserName(string username);//根据用户得到用户

IRoleDao: 角色接口

复制代码
public list<Role> listRoles();//查询所有的角色

public list<Role> listUserRole();//查询某个用户所有的角色

pubic UserRole loadUserRole(int userId,int RoleId);

public void addUserRole(int userId,int RoleId);

public void deleteUserRole(int UserId,int RoleId);

public void deleteUserRole(int UserId);//删除某个用户的所有角色

public List<Resource> listRoleResources(int roleId);//根据角色Id添加角色可以访问的资源

public void addRoleResource(int RoleId,int resId);

public void deleteRoleResource(int roleId,int resId);

public RoleResource loadRoleResource(int roleId,int resId); //获取角色资源对象
复制代码

IResourceDao: 资源接口

public List<Resource> listResource();

 02 实现Service层:

IUserService     IRoleService   IRoleResource

shiro.Kit包下面添加密码加密函数  

复制代码
static String md5(String password,String salt) {

 String p = null;

   p = new Md5Hash(password,salt).toHex();

   return P;

}
复制代码

03 Junit 实现对Service层测试;

27、目标识别的最新进展 本文综述了目标识别(OID)领域的最新进展,重点介绍了质量评估、预处理和搜索空间缩减等关键技术。文章分析了多种质量指标,如缩减率、对完整性、召回率和精确率等,并探讨了它们的适用场景。同时,详细介绍了预处理中自动学习转换规则的方法,以及传统阻塞、排序邻域索引等搜索空间缩减技术。此外,文章还讨论了动态选择缩减技术的方法,并展望了未来研究方向,如更智能的预处理、自适应的缩减技术和与人工智能的结合。希望这些技术和方法能够为目标识别领域的研究和实践提供参考和帮助。 阅读详情

相关推荐

【JavaSE】之流程控制与方法

Java基础之Java流程控制与方法相关知识介绍~

小新要变强的博客 5797

SpringBoot整合Shiro

SpringBoot整合Shiro

爱笑的boy的博客 1809

[Linux项目实践] LCD Panel的硬件分析及调试

LCD硬件分析 项目使用3.5” TFT-LCD并且支持触摸控制。LCD的硬件可从几个方面学习:1)查看LCD的硬件连线。2)查看数据手册了解寄存器的控制。3)查看LCD DATASHEET了解硬件操作 1)LCD硬件连线 在图中有33个引脚,22根数据引脚和9根控制引脚。 LCD的工作原理:像素点是从左至右,从上至下逐个显示,LCD控制寄存器会从从内存中的framebuffer通

Terry_Yuan的技术专栏 3024

Apache Shiro

Apache Shiro是一个Java的安全(权限)框架.Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSe环境,也可以用在JavaEE环境Shiro可以完成,认证,授权,加密,会话管理,Web集成官网:https://shiro.apache.org 里面有Shiro 在gitee的下载地址什么的,看不懂,1分钟就解决了建议好好读一下:三个核心组件:Subject, SecurityManager 和 Realms.Subject:即“当前操作用户”。但是,在Shiro中,Subjec

tiantiantbtb的博客 1456

LaTex的下载与安装(2024小白+windows系统)

本文主要介绍了Latex的下载与安装,还包括安装过程中遇到的小问题的解决。

m0_53096519的博客 2万+

Jetson Orin NX上CAN总线调试全攻略:从硬件焊接到开机自启动(附常见问题解决方案)

本文详细介绍了在NVIDIA Jetson Orin NX开发板上进行CAN总线调试的全过程,包括硬件焊接、驱动配置、通信测试和开机自启动设置。针对常见问题如信号接反、波特率设置等提供了实用解决方案,帮助开发者快速实现稳定的CAN总线通信。

c2d3e4f的博客 1076

Apache Shiro 安全框架

Realm域:Shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源/*** 自定义Realm 处理登录 权限*/@Autowired@Autowired@Autowired/*** 授权*/@Override// 角色列表。

m0_73745224的博客 2094

关于海康MVS软件显示速率低与1GB、相机丢包的设置优化

工控机主要应用与视觉检测!相机网线及工控机网口都是千兆的!设置完巨帧数和速度与双工(选择为全双工),显示速度低与1GB,不能够正常工作。C.LA-Properdes-Advanced-将RecerveBuffers更改为2048。E.LAN-属性-电源管理-取消选中允许计算机关闭此设备以保存电源。这种情况均为MVS设置不熟悉,可参照如下设置优化相应端口相机配置。D.局域网-属性-高级-将传输缓冲区更改为20484。B.LAN-属性-高级-将中断记录部分更改为执行。A.关闭采集控制帧速率控制。

米可的博客! 8827

shiro权限框架

文章目录Shiro架构与功能介绍1.认证与授权相关基本概念2.Shiro四大核心功能3.Shiro三个核心组件spring security和shiro的区别相同点:不同点:第一章 权限概述1、什么是权限2、认证概念【1】什么是认证【2】认证流程【3】关键对象3、授权概念【1】什么是授权【2】授权流程【3】关键对象第二章 Shiro概述1、Shiro简介【1】什么是Shiro?【2】Shiro 的特点2、核心组件第三章 Shiro入门1.1什么是shiro1.2shiro功能简介2.1外部来看Shiro2

欢迎来到编程小栈 2922

AutoSAR MemMap模块概述及配置参数详解

这个模块是干啥的?它是用来配置Memory Mapping and Compiler Abstraction module。

4508

2026年【江苏“信息与未来”编程思维】真题及题解(T6:桌面游戏)

2026年【江苏“信息与未来”编程思维】真题及题解(T6:桌面游戏)

王老师青少年编程 535

Apache Shiro,这一篇就够了

点击后会跳转到一个login.jsp页面,这个不是我们想要的效果,我们需要自己定义一个login页面!然后在 shiroFilterFactoryBean 中配置一个未授权的请求页面!我们再次启动测试一下,访问add,发现以下错误!在UserRealm 中添加授权的逻辑,增加授权的字符串!改造UserRealm,连接到数据库进行真实的操作!再次测试,成功的跳转到了我们指定的Login页面!编写实体类:(和数据库中的表字段要对应哦)使用shiro的过滤器来拦截请求即可!在前端修改对应的信息输出或者请求!

大河之犬的博客 1607

手撕Lua字节码:从黑盒到透明

lua 字节码 怎么‘手撕’一个 chunk 看看里面啥样?我手里有一个.luac或出来的二进制字节码,想知道里面到底是什么结构、哪些字段、有哪些指令,怎么一步一步“拆箱”,从一个黑盒变成有迹可循的东西?也就是:不满足于只会loadpcall而是想亲眼看看一个 chunk 内部长啥样,甚至写点工具把它解析出来。这篇就用带你从“拿到一坨.luac不搞高深玄学,尽量让你看完就能自己动手。注:以 Lua 5.3/5.4 为主,细节各版本略有不同,但大体套路是一致的。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 100

Apache Shiro权限框架

简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。 主要功能 三个核心组件:Subject, SecurityManager 和 Realms. Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件

web13618542420的博客 178

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

关于Apache Shiro权限框架的一些使用误区的解释

本人目前在用apache shiro在做权限管理,主要参照张开涛的跟开涛学shiro教程,这个教程写的不好,有一些错误,本人在这里指出来。    本人csdn博客被关闭,正在问csdn那群傻逼到底是怎么回事?我的博客全是技术贴,没有半点不和谐得问题,当然无论如何都是csdn的错,哪怕是服务器故障。    多了不说了,进入正题,shiro是个权限框架提供权限管理等功能,网上的教程一般都是互相抄,

ccdust的博客 8677

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

权限管理框架apache shiro的用法

权限管理框架apache shiro的用法一、权限概述二、常见的权限控制方式2.1 URL拦截权限控制2.2 方法注解权限控制三、权限关系数据模型四、Apache shiro框架介绍五、Apache shiro框架的使用5.1 添加shiro框架的依赖5.2 在web.xml中配置shiro框架过滤器5.3 在spring配置文件中配置bean,id为shiroFilter5.4 配置安全管理器5...

tianzhen620的博客 686

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Apache Shiro 开源权限框架

在 Web 项目中应用 Apache Shiro 开源权限框架 Apache Shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证、授权、加密、会话管理等功能。认证和授权为权限控制的核心,简单来说,“认证”就是证明你是谁? Web 应用程序一般做法通过表单提交用户名及密码达到认证目的。“授权”即是否允许已认证用户访问受保护资源。关于 Shiro 的一系列特征及优点,很多文章...

aikenqiu5098的博客 139

Apache shiro 权限框架

Apache shiro学习文档 作者:pinkhub 时间:2021/12/24 技术栈:springboot+mybatisPlus+shiro 未来,我们抱团取暖,结伴而行… 文档目录Apache shiro学习文档第一章 Apache Shiro 概述第二章 Apache Shiro 架构第三章 Apache Shiro 配置3.1 配置文件(ini)配置3.2 配置类配置第四章 Apache Shiro 核心前提4.1 编码和解码算法4.2 散列算法4.3 认证认证流程案例一:登陆测试1案例二

weixin_44490884的博客 2694

Spring Boot整合Apache Shiro权限认证框架(基础篇)

本文详细介绍了在SpringBoot项目中整合Apache Shiro实现认证和授权的完整流程。主要内容包括:1)创建SpringBoot项目并添加Shiro依赖;2)配置数据库和用户表;3)实现公共响应类和异常处理;4)创建Shiro核心组件(Realm、配置类);5)实现登录认证功能;6)通过权限控制实现接口访问限制。文章提供了完整的代码示例,包括前端页面交互和后端接口实现,并演示了权限验证效果。通过本文可以快速掌握Shiro在SpringBoot中的基本应用,为项目添加安全控制层。

沐雨橙风ιε的博客 1万+

Apache Shiro权限控制框架简介

Apache Shiro权限控制框架简介 要想实现权限控制,可以自己写代码实现,蓄力都的权限控制可以通过过滤器Filter实现,细粒度的权限控制是基于代理对象结合自定义的注解和反射技术来实现,反射技术用于读取注解的信息。所有就有以下主要途径来实现权限控制: 自己动手写框架 使用spring security安全框架,有名,但使用复杂,学习成本高 使用Apache Shiro框架,更

学亮编程手记 743

Apache Shiro权限框架理论介绍

Apache Shiro权限管理框架介绍 Apache Shiro的官网地址如下: http://shiro.apache.org/ Apache Shiro是一个简单易用且强大而灵活的开源Java安全框架,以下简称Shiro。它干净利落地处理身份认证、授权以及企业会话管理和加密。Shiro拥有易于理解的API,你可以快速且容易地使用它来保护任何应用程序——从最小的移动应用程序到最大的web和...

weixin_34364135的博客 236
上一篇: 如何处理海量数据
下一篇: 单例模式的几种实现方式
飞舞蝶恋花
博客等级 码龄10年 81粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值