基于tailwind做前端元素权限控制,还行!

2024-09-14
24639 分钟
...

1 背景

1.1 权限控制

在不同颗粒度、纬度的区分下,可以分模块、页面、元素、接口、数据等

  • 当用户加载模块或者页面,可以基于用户的权限在网关和接口侧进行403拦截

  • 接口可以在后端进行拦截器处理

  • 元素可以基于前端用户当前拥有的最小权限颗粒度进行选择性展示或者交互逻辑

  • 数据权限,由接口测把控,控制前端查询、操作,公司内部sql执行器的权限

1.2 RABC模型

RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是在项目中常用于权限控制的模型。

基础版本,可以分为三个部分,“用户” 、“角色”、“权限”,用户可以拥有多个角色,一个角色可以对应多个权限。

在实际项目中往往会有权限中心去做配置,一个权限会有一个“权限码”,权限在前端代码处理过程中会涉及两个部分

  1. 页面控制

  2. 如果是通过接口做的后端指向前端资源的前后端分离模式,后端会根据权限拦截返回页面是否,同时会返回有权限的菜单menu,对于菜单进行前端动态加载 / 前端判断

  3. 如果是单页面【spa】,前端路由通过前端控制的前后端分离模式,我们可以根据权限码对应的路由进行动态加载 / 或者直接展示

  4. 元素控制

  5. 当前页面所具有的权限【可能是全局、可能不是】,作用于当前页面的元素内容,也可能会分展示/交互

如图所示

1.3 tailwind

在目前前端tailwind对于涉及样式的UI库、项目等,愈发流行,对于这种原子化css的样式,市场已经给出了反馈,可以看下每年github的top库里面会用的依赖。

基于postcss,把样式能力聚焦在classname,在已经具有样式的规范约定之上,同样有拓展能力,可以看到社区也会有基于tailwind的插件,作用于富文本、表单、自适应等场景。

有记忆门槛,但是确实好用,不做过多陈述!

基于上面的应用场景和所需技术栈,如果针对于前端页面内元素基于rabc的展示控制,我想可以通过tailwind来做到这点。于是有了 tailwind-rabc www.npmjs.com/package/tai…


2 可以做什么

tailwind-rabc 可以基于样式的能力来控制前端元素的展示控制,举个🌰,之前我们做权限控制的时候

第一步:通过后端注入或者接口拿到权限码的集合,比如当前用户权限码集合

const auths = ['create', 'update']

表示当前用户具有查看创建和修改的权限

第二步:封装权限按钮,通过当前按钮标识和全局权限auths做比对

const AuthComp = (props: {auth: string}) => { .... }

第三步:引入权限按钮组件,在对应元素位置,把对应的code当作props传给权限按钮

<AuthComp auth="create">
    <div>xxx</div>
</AuthComp>

--------------------------- 以前👆  手动分割  现在👇---------------------------

如果是纯展示控制,其实把展示交给css就好

第一步: 配置权限合集,例如项目涉及到的权限

['create', 'update']

第二步:在对应元素写对应权限类

<div className="auth-create">xxx</div>

3 使用

前提是你的项目使用tailwind

3.1 下载安装

npm i tailwind-rabc

3.2 配置

tailwind的配置文件:tailwind.config.cjs

const rabc = require('tailwind-rabc');

module.exports = {  content: ['./src/**/*.{js,ts,jsx,tsx}'],  darkMode: ['selector', '[data-mode="dark"]'],  plugins: [    // require('@tailwindcss/typography'),    // require('@tailwindcss/aspect-ratio'),    // require('@tailwindcss/forms'),    rabc.plugin({      rabcCode: ['Admin', 'Developer', 'Watcher'],      mountSelector: 'div',    }),  ],};

参数:

rabcCode

当前项目涉及的权限码,也就是rabc模型中对应的“角色”和“权限”

当只有“权限”

如果只有权限的时候,直接传入数组,元素为权限系统生成的权限码,例如 权限吗 12、13

rabcCode: ['12', '13']

当有“角色” 和 “权限”

针对一些项目会有角色和权限同时生效的时候,比如某个元素是某类角色可以直接看到,如果使用权限颗粒度控制,会有大量的权限码比对的情况,

使用对象来配置,角色名做key,角色对应权限码集合做值

{
    [role: string]: auth[]
}

例如:

rabcCode: { manager: ['12', '13'], developer: ['13'] }

mountSelector

权限作用域的css选择器,可选,默认 body,这个是针对css选择器来选择是在当前元素上挂载当前用户所拥有的权限集合的元素选择器,使用场景如下

⚠️:这里的css选择器,后续注入code的元素是能够和这个css选择器匹配

  1. 如果是全局权限,没有因为具体页面会变动,可以挂在body上,就可以不填,默认body,或者自行选择#app,

  2. 如果是分页面,可以用页面最外面的元素作为css选择器,比如#page-a

  3. 当然如果是范式,可以写入div,这种比较宽泛,大多数人挂载权限选择的元素就是div

type

注入到元素后,选择挂载元素的类型,可选,可以 "class" | "data" 这个参数影响到挂载权限元素是通过什么方式挂载的。

3.3 注入权限

import { mountRabc } from "tailwind-rabc";
const ref = useRef<HTMLDivElement>(null);


const yourAccountAuth = ["12"];


useEffect(() => {
  if (ref && ref.current) {
    mountRabc(yourAccountAuth, ref.current);
  }
}, [ref]);

return <div ref={ref}></div>;

这是生成对应的权限作用域,当前ref的子孙元素会对权限码生效

3.4 权限元素

a 当前元素拥有权限,代码写入

<div className="auth-12"></div>

可以基于tailwind的vscode提示🔔

对于只有“权限”的配置,例如只配置了 rabcCode: ['12', '13']

则可以对元素className为 auth-12 、auth-13 

对于“权限” 和 “角色”,例如 配置了 rabcCode: { manager: ['12', '13'], developer: ['13'] }

可以对元素className为 

角色:role-manager、role-developer

权限:auth-12、auth-13

b 当命中权限展示,需要该元素需要的展示类型,即该元素应当的 css属性:display

目前支持:

  'none',  'block',  'inline',  'inline-block',  'flex',  'inline-flex',  'grid',  'table',  'table-row',  'table-cell',

4 分析

优势:

1 该策略可以针对于可跨页面夸元素的元素权限展示控制,颗粒度可以进行划分,支持角色和权限共存

2 代码编写友好,对于样式注入、权限控制很清晰

3 基于tailwind的能力,代码提示完备,代码风格统一

4 权限控制,在代码干预编写中比较方便

劣势:

1 目前功能比较基于rabc的基础版本,对于多权限的控制比较不足

2 基于css【tailwind】,所以能力上限是css的上限,同时也依赖于项目使用tailwind

如果有其他对权限和tailwind的结合有比较好的想法、或者对于tailwind能力拓展有好的想法,可以评论下,友好讨论下。感谢!

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
css2026-06-17
外阴影和内阴影介绍
在前端页面设计中,阴影是非常常见的视觉效果。它可以让元素看起来更有层次感,也可以用来表达悬浮、按压、凹陷、卡片、按钮等状态。 CSS 中最常用的阴影属性是 。它既可以实现外阴影,也可以实现内阴影。 一、什么是外阴影 外阴影指的是元素外部的阴影效果。 它会出现在元素边框之外,让元素看起来像是从页面中“浮起来”了一样。常见的卡片、弹窗、按钮悬浮效果,基本都会用到外阴影。 例如: 这个阴影表示:元素下方有一层柔和的黑色阴影,让卡片看起来更有立...
学习
css2026-05-15
border-image-slice详细介绍
是 CSS 系列属性里最关键、也最容易让人懵的一个属性。 它的作用可以简单理解为: 把一张图片切成九宫格,然后决定哪几块用来绘制元素的边框。 它通常和这些属性一起使用: 或者简写成: 其中 决定“怎么切图”。 一、 是什么? 普通的 只能画纯色边框: 但有时候我们想用图片作为边框,比如: 游戏按钮边框 像素风 UI 复古窗口 聊天气泡 卡牌边框 花纹装饰框 九宫格按钮背景 这时候就可以用 。 例如一张按钮图片长这样: 我们希望按钮变宽时...
学习
css2026-03-05
如何在最小副作用下创建 BFC
在 CSS 布局的江湖中, BFC (Block Formatting Context,块级格式化上下文) 是一个老生常谈却又至关重要的概念。无论是解决 高度塌陷 、 清除浮动 ,还是防止 垂直外边距重叠 ,BFC 都是我们的得力助手。 但是,创建 BFC 的方法有很多: 、 、 、 …… 哪种方法对现有布局的“破坏”最小? ❌ 过去的老方法 在过去,为了触发 BFC,我们不得不使用一些带有副作用的“黑客”技巧: : 元素会脱离文档流,...
学习
css2026-03-03
CSS过渡性能解析:transition: all
CSS过渡性能深度解析:为什么 可能是你页面的隐形杀手 一、引言:一个被忽视的性能陷阱 你是否曾在项目中这样写: 看似简洁优雅,却可能在低端设备上引发卡顿、掉帧。 真相 : 是前端性能优化中高频出现的“隐形陷阱”。本文将彻底揭开它的面纱。 二、核心概念: 到底在控制什么? 指定 哪些CSS属性变化时触发动画过渡 。它是过渡效果的“守门员”: | 值 | 含义 | 生成的CSS | | | | | | | 所有 可过渡属性变化时均触发动画...
学习
css2026-01-26
在CSS中,四种高度视口单位的区别
在CSS中,视口单位是构建响应式网页设计的重要工具,特别是针对移动端开发。除了传统的 ,CSS新引入了 、 和 等更精确的单位,解决传统单位在移动端的局限性。 四种高度视口单位的区别 | 单位 | 全称 | 含义 | 特点 | | | | | | | vh | Viewport Height | 传统视口高度单位,1vh = 视口高度的1% | 在移动端有问题:不考虑浏览器UI变化,经常导致内容被遮挡或出现意外滚动 | | svh |...
学习
css2025-11-04
keyframes 关键帧机制
一、什么是 @keyframes? 用于定义动画在不同时间点(关键帧)的样式变化;配合 属性应用到元素上。 定义动画 :使用 声明关键帧序列; 应用动画 :在选择器中通过 / 相关长属性控制表现。 二、基本语法 等价写法( / ): 三、与 属性配合使用 /相关长属性 | 属性名 | 含义 | 示例值 | | : | : | : | | | 动画名称 | | | | 持续时长 | 、 | | | 速度曲线 | / / / | | | 延...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录