记一次比较有趣的权限判断,虽然中途终止了

104 阅读3分钟

先看产品是怎么描述他的需求的:

image.png 先理一下这里面的逻辑:
1.如果是采购=>有完结按钮权限&&收货仓库是科斯倍=>可以看到完结按钮。
2.如果不是采购=>有完结按钮权限=>可以看到完结按钮。

我理清逻辑之后,瞬间就有了思路,啪的一下很快嗷!

因为有按钮权限的判断,那么按钮的ngif是应该是“按钮权限&&Boolean的组合”。
首先明确如何判断采购:用户分组中有一个采购的分组,我直接将分组中的所有用户取出来作为一个数组,再把当前登录用户的ID与数组中的用户一一对比,如果返回true则是采购,返回false则不是采购。
其次如果是采购,再进行“有完结按钮权限&&收货仓库是科斯倍”的判断,就可以完成权限判断了。
如果不是采购,则直接返回true即可。

争理好思路和计划之后,突然意识到,我没必要在这个页面单独写一个判断,我可以写一个公用方法啊!只要通过改变分组的ID,就可以实现“判断这个用户是否在某个分组理里”的判断,说干就干!

直接自信在公共方法中写了一个函数:

/**
     * 判断当前用户是否在某个指定用户组中
     * 例如需要判断当前用户是否为采购,则将当前用户的ID和采购组中的所有用户ID进行对比
     * @param groupId
     */
    DetermineUserPermissions(groupId: number): boolean {
        // 获取当前用户的ID
        const user = this.getUserId();
        // 用于判断是否是用户组中的用户
        let isUser = false;
        this.confSvc.sendGetCatch(`users/group/${groupId}`).subscribe(res => {
            // 获取指定分组ID中的用户数组
            const userGroup = res['data'].data || [];
            // some用于跳出循环
            userGroup.some(index => {
                // 将数组索引循环与用户进行对比,若相等则返回true代表用户为用户组中的用户
                if (userGroup[index] === user) {
                    isUser = true;
                    return true;
                }
            });
        });
        // 返回结果
        return isUser;
    }

这代码太漂亮了,当我沉醉在自己的代码里的时候同事看到了我的代码,问我这是想干嘛。
我把我的思路描述给他的时候,他一边点头一边说,你为什么不选择直接获取用户登录时候的分组ID呢?
我:“?有这个东西?”
他把后端代码给我翻出来看了一下,确实传了分组ID这个字段。
我再在登陆时候的代码(登录并不是我写的)上添加了获取分组ID的字段,这样再进行判断就轻而易举了。

同事也告诉我,这种在js中进行判断权限的行为是非常危险的,因为只要稍微懂一点代码就可以篡改js文件给自己对应的权限,所以交给后端处理是最为安全的方式,之前之所以大部分权限是通过js判断是因为系统是公司内部使用不需要做加密,同时后端做这种判断会比前端轻松很多。

于是我让后端的同事进行判断后给了我一个0或1的字段用于判断是否可见,按钮代码设置为

<button mat-raised-button class="ml-36" color="warn" (click)="finishOrder(4)"
    *ngIf="supplierDetail.order_status != 4 && supplierDetail.order_status != -1 && confSvc.allAuth.includes(2) && isUser == 1">完结</button>

小小的权限问题学到这么多东西,虽然自己的漂亮代码不得不删除了,但还是收获颇丰。