ACM四维权限管理模型 from beegee

自我消遣之一:四维权限管理模型  本文涉及权限管理的一种面向对象模型的方法和实现。通过分析每次访问发生场景的各要素,并对各要素进行抽象而形成的一种模型,并可用于实现权限访问控制。原谅我自己取了什么“四维权限管理模型”“访问控制矩阵(ACM)”这样难听的名字,还多少有故弄玄虚之嫌,但我在半年前只有这样的见识。 1、访问控制矩阵(ACM)说明:任意对系统使用者产生价值的用例中的操作均在以下四个维度加以控制:l     阅读详情
from  http://dev.youkuaiyun.com/article/34/article/34/34036.shtm
  首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动∣专 题∣SUN∣IBM∣微 软∣微 创∣精 华∣Donews∣人 邮
我的技术中心 
我的分类我的文档
全部文章发表文章
专栏管理使用说明

 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
bing314 (1)
zhangguanshi (4)
zhouxianli (6)
wffy (5)
tele (1)
tolixiaohui (7)
hxhbluestar (1)
gujoy (1)
chenyun2000 (73)
hcj2002 (8)
优快云 - 文档中心 - Java 阅读:610   评论: 0    参与评论
标题  自我消遣之一:四维权限管理模型     选择自 beegee 的 Blog
关键字  自我消遣之一:四维权限管理模型
出处 

 本文涉及权限管理的一种面向对象模型的方法和实现。通过分析每次访问发生场景的各要素,并对各要素进行抽象而形成的一种模型,并可用于实现权限访问控制。原谅我自己取了什么“四维权限管理模型”“访问控制矩阵(ACM)”这样难听的名字,还多少有故弄玄虚之嫌,但我在半年前只有这样的见识。

 

1、访问控制矩阵(ACM)

说明:任意对系统使用者产生价值的用例中的操作均在以下四个维度加以控制:

l         Operator(操作者权限控制):

进行某种操作时,操作的主体。分为:用户,角色,单位

l         OperateMethod(操作方法权限控制):

操作的功能确定,如:读、写、查、删等

l         Object(操作对象权限控制):

操作的影响对象,通常是某种业务对象,如:表单

l         Object.Fields(操作对象属性项权限控制)

业务要求对选项敏感的对象属性项,如:表单的某数据项、表单上的简单控件等

 

2、ACM中四维数据的组成

Operator:操作者,根据业务的需要设定控制项目主要分为用户、角色、单位三种。根据业务的需要,可以控制Operator的作用先后顺序或交并运行规则;

Operate Method:操作方法,根据业务操作的对象的不同,可能是业务操作或是底层的CRUD操作;

Object:操作对象,当前操作的对象,根据业务需求可以是:业务对象,如:项目、表单;

Object Fields:操作对象属性,要求与权限控制绑定的对象的数据项。如:表单字段、表单控件等。

 

3、原理简述

ACM在权限管理和访问控制时的作用原理。一个ACM是由若干控制系统某项操作行为的若干要素组成的规则矩阵。设想一个场景,当某项操作进行时,必然有如下元素:操作者、操作方法、操作对象。所有ACM就指定了一次操作必须满足的各元素的条件。如:有ACM如下:“李厚强”、“修改”、“用户信息”。就代表:“李厚强可以修改用户信息”。当然这是一个简单的例子,事实上,情况远比这个例子复杂。首先要解决的就是操作对象的实例定位问题。即当如下访问控制出现时:“李厚强可以修改用户信息中的姓名,但不能修改用户信息中的身份证号”。很明显,现有的三维ACM已经不能满足要求了。

ACM中的操作对象之所有成为对象,是因为其具有以下两种特征:一是对象是数据的封装、二是对象本身包含对现实对象的抽象。数据的封装简化了数据处理,抽象使得对象的形式更统一、方法数量可控制。但是,当业务要求权限控制到对象的成员这一级别时,这样的封装和抽象无疑将屏蔽掉对象成员的权限敏感性。解决的方法有两种:

 

方法1:将对象的有权限敏感的成员也抽象为ACM中的对象

Operator               Operate Method                  Object

  ―――――――――――――――――――――――――――――――――

   李厚强                    修改                             用户信息

李厚强                   修改                             用户信息.姓名

李厚强                  修改禁止                        用户信息.身份证号

 

方法2:为ACM增加第四个维度――Object.Fields,操作对象属性。

Operator           OperateMethod             Object               Object.Fields

――――――――――――――――――――――――――――――――――――

李厚强                修改                         用户信息                   -

李厚强                修改                         用户信息                  姓名

李厚强         修改禁止(只能“读取”) 用户信息            身份证号

 

粗看,似乎方法1更具有通用性。但考虑到Object.Fields和Object之间的关系、以及其对OperateMethod的影响,问题并不这么简单。原因是,Object是业务对象的抽象,其对应的操作(OperateMethod维度)往往是业务功能操作(BusinessOperate);而Object.Fields所对应的操作往往只有“修改”和“读取”两种,或类似的数据操作(DataOperate),其余的操作控制往往由其所的Object的方法所决定。如:我们不可能独立于用户信息去孤立的删除姓名,而只能“修改”、“读取”。当我们要删除某个姓名时,往往是删除一个用户。

 

Object

Object.Fields

对应操作类别

Business Operate

Data Operate

备注

常见操作均为功能。如:CRUD

以及于对象相关的业务操作

通常只有“修改”和“读取”控制

所有,对于Object和Object.Fields的访问控制所对应的操作对象和操作方法完全不同,在业务系统中Object和Object.Fields所对应的ACM的被访问场景也完全不同。在考虑到权限合并、权限干涉等问题,更好的设计应该是将ACM视作四维,或者这样理解:将系统通用ACM分为两个三维的ACM,即双级ACM。分别控制Object的访问和Object.Fields的访问:

Object ACM 和 FieldsACM

 

4、解决难点

4.1权限合并

双ACM可以很好的控制权限合并。访问Object时通过ObjectACM,访问Object.Fields时,将ObjectACM和FieldsACM进行合并操作,得到最终的访问控制。

4.2权限干涉

通过ObjectACM与FieldsACM的主从关系来控制权限干涉。ObjectACM为主ACM,当ACM禁止某操作时就不用在访问FieldsACM了。(当考虑Operator、OperateMethod后权限干涉情况更加复杂,将在下面加以讨论)

4.3维度管理

ACM实现的前提是各维度各自的统一管理。如:操作者应该可以统一管理,当ACM确定Operator元素后,可以准确的根据Operator元素确定起对应的用户、单位、角色。操作者的统一管理很直接,业务系统多有单位组织管理和用户管理系统。而操作方法和操作对象的统一管理在一般的业务系统中没有。为实现精确的访问控制,必须将所有的操作对象和操作方法项进行统一的管理。

 

5、模型测试

测试四维权限管理模型是适用性。

测试1

说明:业务系统简单功能权限管理的实现,即:对功能访问控制。

一个业务系统往往在UI层上表现为若干有组织的分类的功能访问入口(通常是一个分级菜单组),要求根据当前系统使用者的权限取得相对应的功能访问项目入口。这里,ACM完全胜任:

Operator

OperateMethod

Object

Object.Fields

User/Depart/Role

访问*

功能A入口(菜单项)

-

…

…

…

…

*:对于功能操作入口本身,只有“访问”一种方法。

撇开操作者(Operator)这一维度中可能产生的权限干涉问题以外,不会产生任何其他问题。

测试2:

说明:业务系统对其所管理信息(业务对象)的简单管理时的权限管理的实现,即:对业务对象的访问控制。

实例1:例如任何业务系统都会出现的用户管理,用户本身就是一种业务对象。当一个操作者对系统中“用户”对象进行操作时,访问控制模块将根据其权限对其操作进行“允许”或“禁止”。

Operator

OperateMethod

Object

Object.Fields

User/Depart/Role

修改

User(“用户”业务对象)

-

User/Depart/Role

读取

User(“用户”业务对象)

-

…

…

…

…

 

实例2:例如一个报表管理系统中的已经定义的“报表”,也是一种典型的业务对象。与常见的业务对象不同,“报表”除了常见的CRUD操作,还会有其对应的“提交”、“入历史库”等业务相关操作,即:Business Operate。

Operator

OperateMethod

Object

Object.Fields

User/Depart/Role

修改

ReportSheet(“报表”业务对象)

-

User/Depart/Role

读取

ReportSheet(“报表”业务对象)

-

…

…

…

…

User/Depart/Role

提交

ReportSheet(“报表”业务对象)

-

User/Depart/Role

入历史库

ReportSheet(“报表”业务对象)

-

…

…

…

…

*:业务对象的操作多是Business Operate

利用四维ACM,避免了将Object.Fields作为Object的子对象来处理,从而简化了处理权限干涉问题时的模型。

测试3:

同样的报表管理系统中的已经定义的“报表”,每个“报表”是作为一个“工件”来处理的。这种“报表”类似与MS Office 2003的智能文档:根据业务需求,“报表”中的每个“数据单元格”或简单控件都要求权限敏感。

Operator

OperateMethod

Object

Object.Fields

User/Depart/Role

修改

ReportSheet(“报表”业务对象)

单元格A

User/Depart/Role

读取

ReportSheet(“报表”业务对象)

单元格B

…

…

…

…

User/Depart/Role

激活

ReportSheet(“报表”业务对象)

按钮1

User/Depart/Role

激活

ReportSheet(“报表”业务对象)

按钮2

…

…

…

…

*:Object.Fields对应的操作多是Data Operate:对于单元格、数据项就是“修改”、“读取”;对于简单控件就是“可见”、“激活”。

**:此时的Object维被弱化,成为Object.Fields的索引项

由于对Object的ACM和对Object.Fields的ACM是分开的,便于处理权限干涉问题。如:根据业务需要,UserA具有对ReportSheetA的读取权限,但是但对ReportSheetA中的FieldsA不可读。这时利用算法根据ObjectACM和FieldsACM进行合并即可,不必将Field视作Object的成员来进行访问控制,更不用将Field视作Object的子对象。

 

6、实践指导

其实,这里用于测试的四个场景基本覆盖了报表系统的访问控制的情况。下面,以此作为业务标本,简要描述如何在具体业务系统中实现ACM的访问控制。

访问控制类

最先的思路是在一个业务系统中设立一个通用的ACM。这是自然而然的想法,因为有很多通用的规则判断操作、访问验证规则等是控制不同对象都需要的,所以利用面向对象的方法,可以将ACM的验证规则、操作等封装到对象中,便于业务系统中广泛复用。

在这里,将这种对象包含访问控制操作、验证规则的类,称作:访问控制类AccessController。

图1:系统中有访问控制要求的模块均调用AccessController类

 

以上模型非常简单,可操作性好。但很明显,各个模块要求的验证规则虽然具有相同的验证调用接口,但其验证规则各不相同。如果要强行将这些规则封装在同一个类中,并利用参数的变化来控制验证规则实例的调用,明显是对抗“组合爆炸”。每增加一个有访问控制要求的模块、或每增加一个验证规则,AccessController都会被增加一组方法,相关的控制参数也有可能有变化,不可避免的会出现“大类”和“长方法”,系统粒度分布不均匀。

利用接口设计改善。我们不知道一个业务系统中会有若干访问控制验证业务规则,分属于不同的访问控制模块,并且随着系统的升级或需求的变化,有可能会增加新的验证规则。用接口设计可以一定程度上改善这个问题。

图2:利用实现类来实现IAccessController接口,

各实现类具有相同的调用格式,不同的规则

 

改进后的模型可使得开发组在开发时,根据具体访问控制的要求编写不同的验证规则,但同时验证过程的代码外形又具有通用性。如图2演示,每个访问控制实现类都有IsValidate函数,接受“操作者”、“操作方法”、“操作对象”作为参数,并验证该操作的合法性。

提示细节是,IsValidate函数接受的参数也是接口,即:

public bool IsValidate (IOperator,          // 操作者接口

       IOperateMethod,    // 操作方法接口

       IAccessObject)      //  操作对象接口

*:实际设计时可以考虑使用抽象类(Abstract Class)等来替代接口,但原理一致,都是要推迟实现部分,以获得良好的扩展性。

而为了配合这样模型,受权限访问控制的各要素(“操作者”、“操作方法”、“操作对象”)均需在构架时即接口化。在实现时,根据业务需求实现相应接口,再作为参数传入访问控制验证函数中。

以上只是初步想法,具体实现形式待定。

 

7、总结

以上分析仅用作讨论。完全的自我消遣,嘿嘿! 

  

 

附录A:

对应第5节,模型测试各场景,利用分级的ACM实现业务需求的时序图,仅供参考:

 

测试1:

操作流程对象即激发访问的业务系统组成部分,这里可以理解为GUI用户界面,以及其中的简单控制。

 

测试2:

沿用以上时序图,模仿真实情况:FunctionA即是对某个ReportSheet的访问。这时FunctionA即是访问ReportSheetA的操作控制流程对象。

 

 

测试3:

对ReportSheetA中的FieldA作访问,利用FunctionA判断处理权限干涉问题,交并权限后再访问ReportSheetA和FieldA。

 

 

- end -

 

Beegee: 和我在一个产品开发中共事了半年的部门经理(其实是产品经理)告诉我可以离开项目组了。半年前,他委托我设计他的产品中的权限管理模块。于是,我用我贫瘠的大脑给他想了些方案。难得他还那么看得上,支持我实现了我的设计,当然也加了不少我不喜欢的东西。现在,却因为一些原因我要离开这个产品组了,这位经理也不准备对这个模块再作更多的投入了,于是我想我可以把我的这些的想法拿到我的Blog中了,算是自我消遣吧。^_^,也希望能够帮助其他程序员完善他们自己的设计,全当反面教材啦!
     共两篇:
     1.“
ACM四维权限管理模型
”(本文)
     2.“
权限管理与访问控制概要设计”


相关文章
对该文的评论


说说关于访问控制模型 **前言**前段时间一直在帮导师写论文,虽然在实验室之余,本人致力于学习前端技术(好想在这里加一个坏笑的表情),但是云计算的学习不能中断啊,论文不能停。。。。也就说一下对访问控制的理解,表示我还是一个研究生。 在信息环境中,访问控制主要用来确保信息不会被非法访问。在访问控制的安全机制中,经过合法授权的实体能够对请求的资源进行合法的访问,而未经过授权的实体则不能访问所请求的资源。因而,访问控制的目的 阅读详情

相关推荐

【系统架构设计师】七、信息安全技术基础知识(访问控制技术|抗攻击技术|计算机系统安全保护能力等级)

分布式拒绝服务DDoS攻击是传统DoS 攻击的发展,攻击者首先侵入并控制一些计算机,然后控制这些计算机同时向一个特定的目标发起拒绝服务攻击。克服了传统DOS受网络资源的限制和隐蔽性两大缺点。

帅次的博客 2368

系统架构10 - 信息安全(下)

系统架构 - 信息安全相关

Great_est的博客 1420

读深入理解JAVA内存模型整理的思维导图-免积分

读深入理解JAVA内存模型整理的思维导图 本人记忆差,整理这个思维导图,相当于较认真的看了一遍,整个思维导图,基本上就是对原文的拷贝。 有了层级关系。和本人自己的一些理解。由于思维导图弄出来的图片大于100M了。所以就放出源文件, 更方便的阅读查阅。

《系统架构设计师教程(第2版)》第4章-信息安全技术基础知识-03-访问控制及数字签名技术

《系统架构设计师教程(第2版)》笔记,第4章-信息安全技术基础知识-03-访问控制及数字签名技术

架构+开发+运维 1249

四维数据matlab空间建模scatter和slice

用MATLAB写的四维数据空间建模源代码,十分简洁明了,如果你想用MATLAB做出四维数据[X,Y,Z,S]的空间立体图,其中X,Y,Z表示三维空间坐标,S是属性值,那么这两种方法一定对你有用!

医疗影像处理实战:如何用Slicer和Mimics将.nii.gz文件转为.ply格式(附避坑指南)

本文详细介绍了利用3D Slicer和Materialise Mimics软件,将医学影像中常见的.nii.gz格式文件转换为通用三维网格.ply格式的完整实战流程。文章重点分享了从数据分割、DICOM序列导出到高质量网格生成的核心步骤与关键参数设置,并提供了针对常见问题的避坑指南,旨在帮助医学影像研究者和工程师高效完成从体数据到三维模型的关键转换。

weixin_28304023的博客 102

四维数据matlab空间建模scatter和slice源代码:让四维数据可视化触手可及

四维数据matlab空间建模scatter和slice源代码:让四维数据可视化触手可及 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在数据分析和科学研究领域,能够有效地展示多维数据是至关重要的。四维数据matlab空间建模scatter和slice源代码是一个开源项目,它为研究人员和工程师提供了一个强大的工具,以MATLAB为平台,实现四维数据的空间立体可视化。通过...

gitblog_06741的博客 813

麒麟linux离线源码编译安装zabbix-agent

离线源码编译安装zabbix-agent

qq_37263429的博客 2265

Linux安全--访问控制机制(ACM)

1. 访问控制机制(ACM)     ACM:即Access Control Mechanism     ACM为系统管理员提供了一种控制哪些用户、进程可以访问不同的文件、设备和接口等的一种方式。当需要确保计算机系统或网络安全时,ACM是一个主要的考虑因素。     ACM主要有以下6种方式:     1) 自主访问控制:Discretionary Access Control (DAC)

MyArrow的专栏 1万+

Nexus7二代刷机教程(新手向)

该教程将使用lineageos(Android 11),同时借鉴了lineage官方的教程和songelf的教程。

2403_84391487的博客 5207

Hyper-V显卡直通实战:手把手解决Windows 11虚拟机错误码43(附完整参数配置)

本文详细解析了在Windows 11 Hyper-V虚拟机中配置显卡直通时遭遇错误码43的根源,并提供了从环境检查、核心PowerShell命令(如Set-VMGpuPartitionAdapter)配置到虚拟机内驱动替换的完整实战解决方案,帮助用户彻底解决显卡驱动无法加载的问题。

weixin_29238147的博客 894

ACM(访问控制模型),Security Identifiers(SID),Security Descriptors(安全描述符),ACL(访问控制列表),Access Tokens(访问令牌)

对于《windows核心编程》中的只言片语无法驱散心中的疑惑。就让MSDN中的解释给我们一盏明灯吧。如果要很详细的介绍,还是到MSDN仔细的看吧,我只是大体用容易理解的语言描述一下。   windows的安全访问控制(ACM,access control mode)是由两部分组成的。一个是访问令牌(access tokens),另一个是安全描述符(security identifiers)。

xujiezhige的专栏 4161

纯C语言实现的Luhn算法(信用卡校验位):详解与示例

在本文中,我们详细介绍了如何使用纯C语言实现Luhn算法,并提供了一些示例代码。用于检查任意长度的数字字符串的有效性,用于计算给定数字字符串的校验位字符。我们还提供了一个简单的“main”C程序,用于在命令行上接受一个或多个数字字符串,并计算它们的校验位字符。通过阅读本文和理解示例代码,我们希望读者能够更好地理解Luhn算法的工作原理,并能够在自己的项目中应用这种算法。

qq_38334677的博客 1220

Linux系统关于ACM时间的使用和文件目录的权限的问题

Linux系统关于ACM时间的使用和文件目录的权限的问题一、首先讨论目录文件的权限问题 : 1.要进入一个目录需要什么权限 由此可以得出结论,想要进入一个目录,该目录至少需要x权限。2.要在目录里存放文件需要什么权限 使用同样的方法不难得出结论 单独加 r w x权限都无法在file目录下创建文件

junkeal的博客 454

[PCIE5.0] 2.2.8.9 Optimized Buffer Flush/Fill (OBFF) Message

这段文字讲解的是 优化的缓冲区清空/填充(OBFF)消息,它是 PCI Express(PCIe)规范中的一个可选功能,用于向设备报告平台中央资源的状态。简单来说,OBFF 主要帮助设备了解当前平台资源(如缓存或内存)的状态,从而优化数据的处理和传输。这章重点内容如下。

系统固件工程师 538

6.6kW的车载充电器(On-Board Charger, OBC)电路分析

图片展示了6.6kW的车载充电器(On-Board Charger, OBC)电路,其中包含双向和单向两种拓扑结构。接下来我们将深入分析每个模块的设计、原理及其优势,以帮助理解不同结构在实际应用中的选型和应用。

weixin_43199439的博客 5643

权限系统_访问控制模型 访问控制模型(DAC,MAC,RBAC,ABAC)

零信任|零信任架构和访问控制模型ABAC 近几年,权限访问控制模型被反复提及,目前常用的是RBAC(Role-Based Access Control),RBAC是迄今为止最为普及的权限设计模型,其优点是简单,实现起来非常容易。 但是随着授权需求复杂度的提升和对控制逻辑灵活性的高度要求,ABAC(attribute-based access control)访问控制模型将会越来越普及。近期火爆的零信任架构里,ABAC模型就比RBAC更加合适。 ABAC既然是针对属性(attributes)的,那我们先

fei33423的专栏 4763

scratch经典游戏主题源码分享,包含了20多款经典游戏

经典游戏案例:1、360度角度射击游戏 2、捕鱼达人 3、超级马里奥 4、超级玛丽 5、吃豆人相关 6、穿着喷气背包的海龟 7、大鱼吃小鱼 8、俄罗斯方块 9、飞机大战 10、愤怒的小鸟 11、黄金矿工 12、节奏大师 13、连连看 14、迷宫游戏 15、跑酷游戏 16、扫雷 17、水果忍者 18、坦克大战 19、推箱子 20、消除泡泡 21、保卫萝卜 22、植物大战僵尸

IT_Scratch的博客 1万+

第五讲 访问控制技术

概念:访问控制 访问控制列表 访问能力表 授权关系表            自主访问控制 强制访问控制 基于角色的访问 理解:访问控制技术的实现原理,技术特点            访问控制模型的特点及使用场景 运用举例:能够依据具体的应用场景,选择恰当的访问控制

skicth的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Linux 下的权限与 ACM

首先,我们要明确在Linux下的一个概念:一切皆文件;那么Linux下的文件类型有什么呢? 1.普通文件类型 [-]开头 2.目录类型 [d]开头 3.连接文件 第一个字符为[ l ] 4、设备和设备文件 块设备文件,即一些存储文件,如硬盘、软盘等,第一个字符为[ b ] 字符设备文件,即一些串行端口的接口文件,如键盘、鼠标等,第一个字符为[ c ] 5、套接字 第一个字符为[

LordWingF的博客 715

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux下ACM时间含义及权限修改

stat命令主要用于显示文件或文件系统的详细信息,例如我们创建一个文件file,用stat指令查看 注意到stat file后出现的三个时间Access Modify Change了吗?这三个时间的含义为: Access: 最后一次访问该文件的时间。  Modify:最后一次修改该文件内容的时间。  Change:最后一次改变该文件属性或状态的时间。  当使用cat查看文件时

lhy2932226314的博客 600

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

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

普通用户增加/dev/ttyACM0操作权限

干煸四季豆 1万+

项目经验第一课——节点权限管理的应用

入职有一段时间了,跟着大佬做项目,还在摸索过程中,这个项目很庞大,粗略估计,仅仅是项目源码都有1G左右,业务逻辑对于初学者的我来说很复杂。但是这个项目中有一点我觉得很值得借鉴,就是节点权限管理功能。 这个功能我只了解了一个大概,大致内容是这样的:在开发过程中将所有的功能都写好,这里的所有功能不区分管理员和普通用户。所有功能完成后再对各个功能赋予不同的权限,比如说,我开发一个教务管理系统,包括三个...

qq_34290202的博客 727
上一篇: load data from (txt/ table and so on)
下一篇: 2(以后看的)
tojava
博客等级 码龄24年 2粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值