去年冬天,网页权限我帮一个开咖啡馆的网页权限朋友处理网站问题。他的网页权限店开在胡同深处,生意不错,网页权限就弄了个简单官网,网页权限放菜单、网页权限营业时间和几张环境照。网页权限结果有天他慌慌张张打电话来,网页权限说网站首页被人换成了一张全黑图片,网页权限上面用红字写着“你的网页权限权限管理烂透了”。我登进后台一看,网页权限差点笑出来——那个网站所有页面都设成了“公开可编辑”,网页权限连数据库密码都写在源码注释里。网页权限这事儿听起来离谱,网页权限但网页权限出问题的网页权限方式往往就这么直接。
权限这东西,说白了就是决定“谁能在什么条件下对什么资源做什么”。听起来像绕口令,但拆开看就三件事:用户是谁、资源在哪、操作是什么。很多开发者一上来就写功能,登录框一弹,密码一存,就觉得完事了。可真正的坑埋在后面。比如一个电商网站,普通用户能看自己的订单,客服能看所有订单但不能改价格,管理员能改价格但不能看用户支付密码。这些规则如果不在代码里写死,迟早有人能顺着URL爬进不该去的地方。
我见过最典型的错误是把权限判断放在前端。按钮隐藏了,链接删了,但接口地址没变。用户随便抓个包,把请求里的用户ID从123改成124,就能看到别人的收货地址。前端权限是给正常人用的,后端权限才是给所有人用的。这话我说过很多遍,但每次review代码还是能看到类似问题。有个做在线教育的团队,课程视频链接是直接暴露的,只要知道文件名规则,不买课也能下载。他们后来加了token验证,但token有效期设了三十年——这跟没加有什么区别。
权限的粒度也是个麻烦事。太粗了不行,比如整个后台只分“管理员”和“普通用户”,结果客服能删数据库。太细了也难受,每个按钮配一个权限点,最后权限表比业务表还大,改个需求要动十几张关联表。我自己的经验是,按“角色+资源+动作”来设计,但别一开始就追求完美。先跑通核心流程,把最要命的地方锁死——支付、删除、导出、修改他人数据。剩下的边角料,等有人抱怨了再补。这不是偷懒,是避免过度设计把项目拖死。
还有一个容易被忽略的地方:权限的继承和覆盖。比如一个用户属于“编辑”组,又单独被授予了“发布”权限,那他是能发布还是不能?不同系统处理方式不一样,但文档里往往不写清楚。我遇到过最混乱的情况是一个后台系统,用户组权限和用户个人权限冲突时,代码里是“后查到的覆盖先查到的”,而查询顺序取决于数据库返回顺序。这意味着同一个用户,刷新两次页面可能看到不同的按钮。这种bug查起来能让人崩溃。
说到底,网页权限不是加个登录框就完事。它是一套贯穿数据库设计、接口编写、前端渲染的规则。规则可以简单,但不能没有。就像我那个咖啡馆朋友,后来我帮他重做了权限,所有写操作都要验证session,数据库密码挪到环境变量,后台入口加了IP白名单。他问我是不是太麻烦了,我说你总不想哪天首页又变成黑色吧。他想了想,说那还是麻烦点好。
现在每次新建项目,我都会先画一张权限草图:有哪些角色,每个角色能碰哪些数据,哪些操作必须二次确认。这张图不一定完美,但至少能让后面写代码的人知道边界在哪。边界清楚了,剩下的就是填坑的体力活。最怕的是边界模糊,大家凭感觉写,最后谁也不知道系统到底允许什么。那种项目,不出事是运气,出事是必然。