比如我有A,B,C,D,E,F,G总共7个链接,普通用户只可以访问A,管理员可以访问全部…在数据库设计中,有一张角色表,内容一个是user 一个是admin,我的问题是这个user角色对应的资源是存A好,还是存BCDEFG好…如果存A,那么就是user角色不能访问的链接,如果存BCDEFG就是用户可以访问的链接…这2种方式在权限认证的时候还是有区别的…如果存A,就判断(url == A) return fasle (循环一次), 如果存BCDEFG,就判断 (url == [ABCDEFG]) return true(最少循环一次,最多循环数组长度),正常好像都存BCDEFG,我感觉是不是存A好一点?是不是有我没想到的问题?
你可以开一个链接表url,再开一个角色表role,然后用中间表_role_url_对两者进行映射 你可以把映射结果放进缓存或者redis,用户进来通过角色和url去判断是否具有这个url即可。如:联表查询_role_url_中间表后得到: const role_url = { user : [A] , admin : [A,B,C,D,E,F,G] }; //角色-链接映射 通过服务端中间件判断 ,如果role表示用户的角色,url表示用户请求的链接 , 只需要判断: return role_url [role] && url ? role_url[role].includes(url) : false;
这些问题用 Enhancer 轻松搞定,不用自己写代码:enhancer.io
参考开源项目
https://nutzwk.wizzer.cn
@EdisonForMan 谢谢解惑,其实我的问题是const role_url = { user : [A] , admin : [A,B,C,D,E,F,G] }; 这个映射应该怎么设计? 假设user只可以访问A B C D 4个链接,设计方法如下: const role_url = { user : [A B C D] , admin : [A,B,C,D,E,F,G] }; 第一种设计方法 存用户可以访问的资源 const role_url = { user : [E,F,G] , admin : [A,B,C,D,E,F,G] }; 第二种设计方法 存用户不可以访问的资源 因为我的系统,大部分资源是用户可以访问的(占百分之八十),所以是不是存用户不可以访问资源好一点,因为存不可以访问资源,最大循环次数是(资源总数量乘以20%)次,而存可以访问资源最大循环次数是(资源总数量乘以80%)次~~~