小胖 -RBAC(Role Base Access Controller) 原理基础以及设计方案

本贴最后更新于 3063 天前,其中的信息可能已经事过景迁

小胖我今天高高兴兴来上班,进入办公室看了看旁边漂亮的美工妹子以及已经是我老婆的前台妹子之后,一头扎进了自己的技术部办公室,忽然就看到老板在我的位置上坐着玩着手机,看到我进来后,看了看手表,说道:来的挺早的啊。当时我的心情是这样的:

随后我回应道:必须滴,老板好,公司是我家,工作为大家。

老板说道:最近多数客户说咱们的系统登录和删除角色的时候老down机

我:

 

其实是这样的。。。本来我前任用的是mysql进行存储权限,角色,用户关联角色, 角色关联权限的数据信息的。但是查询起来非常慢,原因:

  1. 没有做缓存,每次登陆和访问时都会查询数据库。

  2. 数据会有很多冗余,比如有一个用户拥有两个角色并且角色同时拥有多个一样的权限时,为了保证删除一个角色而不会丢失另一个角色也拥有的权限时,在给用户添加角色,会多次复制一样的权限关联数据。

当然以我的机智。必须改版啊。

后来我就加了一个步骤,哈哈,把数据缓存进了session,我当时是这样的感觉:

但是问题又出现了,由于有一个牛逼客户创建了100个角色,和100个用户。登陆的时候在进行权限加载的阶段会变得巨慢。

在震惊这位客户的无聊成都之余。。。。我决定彻底的改变权限结构。

于是我就用了redis进行所有的权限关系数据缓存

结构大概是这样的:

用户和权限表:

key:[用户id]ulp,value:(key:url,value:[角色Id1,角色Id2,角色Id3,角色Id4,])

 //相当于map内套map 

 第一个key 是用用户id+“ulp”字符串组成,用于登录使用时快速查询一个用户的所有权限列表,

第一个value内部key是权限的url 这样在filter内直接可以获取url后去权限列表读,如果返回为null时则不存在改权限了。

第二个value 是该权限分别属于这个用户多个角色中那几个角色赋予的,这样在删除一个角色时如果有其他角色给于用户此权限,那么该权限还会存在,如果只有一个角色的话那么改权限会在权限列表中被删除。

这次又出现问题,以为多年的高级程序员经验觉着100%是因为:

我给老板说这个问题很难解决啊。还是上一任留下的麻烦。叫我思考一下。一会应该可以解决。

我默默地给客户远程打开了redis

我觉着这样下去我会疯的,于是乎又想彻底解决这个问题。

于是我就想呀,直接自己写一个专门的保存权限相关信息的数据存储机制好了。

然后从新设计了一下,这个是第一版:

马上开始编码,在编码过程中可能要修改的呀,不过我这么机智应该难不倒我。太晚了。睡觉吧。明天还要上班呢。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 216 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    365 引用 • 1841 回帖 • 3 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 260 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 753 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 394 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 688 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 73 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 724 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 174 关注
  • 反馈

    Communication channel for makers and users.

    126 引用 • 929 回帖 • 266 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    946 引用 • 1460 回帖 • 1 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 5 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    171 引用 • 513 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    950 引用 • 943 回帖
  • 导航

    各种网址链接、内容导航。

    43 引用 • 177 回帖
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 496 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    169 引用 • 1527 回帖 • 1 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    87 引用 • 122 回帖 • 629 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 543 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    31 引用 • 96 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 700 关注