当前位置: 首页 > news >正文

关于权限的一些想法

准备做权限的时候,有两套方案。一·在数据库保存所有的那些需要控制的点叫做权限表。基本就是一些id。然后一个角色表,角色对应权限,用户对应角色。 

第二种是以前在一个项目中见过的权限控制方法。用户-角色-权限,这些不变,有变的是:权限不用一堆数据表示:使用二进制即类似"01011100110"这样的字符串来表示,在用户拿到这些数据以后使用同一的方式进行解析,比如前四个表示某个窗体,某个页面,前四个中的第一个表示添加0是可用1是不可用。

初步分析两者之间的差异,先说共同点。都有一些写死的东西。官方一点的话叫做,扩展性较差。

差异:第一个结构清晰,维护起来比较容易。但用户频繁的查询,增加了不必要的IO操作,性能方面会差很多,尤其web程序。

第二中:可读性差。维护起来麻烦。可能需要在对应的结构数据中添加一些必要的信息才能达到扩展的可能,一旦出错,调试也是个麻烦事。优点就是占的地方小,如果用到web中可以很大程度上的提高性能。对于某用户的权限信息,可能只有不到1kb.

--------------------------------------------------------------------------------------------------

那么理想中的权限应该是可以扩展的,而且在网络传输中尽可能的减少传输内容,最好是在这个基础上再减少IO的操作,让各部分的负载能达到某种意义上的平衡。当然了,最重要的还是可靠稳定以及拿到任何地方都可以使用。

可扩展,目前能想到的貌似也只能是将数据像类一样保存,将来若是某个页面或者窗体添加了某个需要控制权限的按钮只需要在对应的类里边加上要给属性就ok.数据存储上吸取第二种方式的那种存储。但不能完全复制。在它的基础上做改动,想来想去貌似只有json格式的数据能同时满足这两种方式的操作。。

结构化满足,能被反序列化。能扩展,而且,修改不会对之前的数据产生影响。当然这个里边该考虑的还有json支持的数据量的大小。

还有一个容易忽略的问题,就是如何将这些信息定义到一个类里边,或者某个可结构化的东西中去。将来如果要给某页面加个按钮,实现一些无关后台的东西,但同时要求只有某人才能看到一类的需求。重新修改程序当然可以做到,但希望能把这个东西做成可拆卸的。只修改某个配置文件,以及页面就完美实现。

到这里我想到了xml。如果我能将网站,或者程序的结构信息保存到xml中。自定义一种书写规范,将来按照这样的方式在开发的时候将所有信息都完整添加到这个文件中结构类似下边这样:

<project>
    <pagename>
        <元素ID/>
        <元素ID/>
    </pagename>
    <pagename>
        <元素ID/>
        <元素ID/>
    </pagename>
</project>

在权限分配的页面中读取这个xml文档。被选中的节点,在保存的时候放到json串中。放到数据库里面...

如果这么做,一个项目中权限只会有一个xml,一个页面维护这个xml(开发时,添加节点,删除),一个权限赋值(修改)的界面。数据库 用户表中添加一个角色(varchar),存放用户的角色属性。一个用户可能会属于多个角色,这里的大部分数据只会是一个数据。不排除有多个角色的用户,但这样的数据会非常少,所以这里只需要用逗号隔开,程序那边做点处理就好了。角色表中会有一个字段来保存该角色对应的json数据。将来用户登录的时候获取到对应的角色对应的json数据。通过一点点计算就可以控制到每个页面的元素展示,显示还是隐藏...

  到这里权限功能已经算是基本搞定了。这需要注意的就是xml中的pagename,元素id,与对应页面的耦合度高,一处页面名称的修改直接会导致权限控制失效,id的修改也会导致。一般情况下,页面的名称是不会变的。会变化的可能只会页面中的元素ID.可以添加额外的标签描述Attribute。来判断对应元素的显示隐藏..

转载于:https://www.cnblogs.com/zzfstudy/p/4463274.html

相关文章:

  • 设计模式 笔记 策略模式 Strategy
  • 【STL源码剖析读书笔记】【第1章】STL概论与版本简介
  • SET-UID程序漏洞实验
  • Asp与Asp.Net的区别
  • android host usb
  • Fighting
  • 基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)
  • Swing基础
  • php post
  • poj--1517
  • Midas Civil的钢束生成器
  • 练习写一个工资结算系统
  • linux的各个子系统
  • 域名注冊以及域名解析设置
  • 约瑟夫环实现之非递归
  • Apache Spark Streaming 使用实例
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CentOS从零开始部署Nodejs项目
  • ES6核心特性
  • extract-text-webpack-plugin用法
  • JavaScript 一些 DOM 的知识点
  • Mocha测试初探
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • MySQL主从复制读写分离及奇怪的问题
  • python docx文档转html页面
  • Sass Day-01
  • TypeScript迭代器
  • yii2中session跨域名的问题
  • 前端面试之CSS3新特性
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • No resource identifier found for attribute,RxJava之zip操作符
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (论文阅读30/100)Convolutional Pose Machines
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET 设计一套高性能的弱事件机制
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET企业级应用架构设计系列之结尾篇
  • .net中应用SQL缓存(实例使用)
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [Deepin 15] 编译安装 MySQL-5.6.35
  • [docker]docker网络-直接路由模式
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [HOW TO]如何在iPhone应用程序中发送邮件
  • [IOI2007 D1T1]Miners 矿工配餐
  • [leetcode 数位计算]2520. 统计能整除数字的位数
  • [leetcode] Multiply Strings
  • [Leetcode] Permutations II
  • [Leetcode] 寻找数组的中心索引