MST

星途 面试题库

面试题:JavaScript 代理对象的安全增强应用

假设你正在开发一个金融相关的应用,需要对一些关键对象的操作进行严格的安全控制。请说明如何利用 JavaScript 代理对象来实现对对象属性的访问控制,确保只有授权的操作才能执行,同时要防止恶意的属性修改和删除。请给出具体代码示例和思路。
40.8万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

思路

  1. 使用 Proxy 构造函数创建代理对象,该对象用于包装目标对象。
  2. Proxyget 陷阱中,检查当前操作是否被授权进行属性读取。
  3. Proxyset 陷阱中,检查当前操作是否被授权进行属性写入。
  4. ProxydeleteProperty 陷阱中,检查当前操作是否被授权进行属性删除。

代码示例

// 目标对象
const target = {
    accountBalance: 1000,
    transactionHistory: []
};

// 模拟权限列表,这里假设只有 'admin' 角色有全部权限
const authorizedRoles = {
    read: ['admin', 'user'],
    write: ['admin'],
    delete: ['admin']
};

// 当前用户角色
const currentRole = 'user';

const proxy = new Proxy(target, {
    get(target, property) {
        if (authorizedRoles.read.includes(currentRole)) {
            return target[property];
        }
        throw new Error('没有读取权限');
    },
    set(target, property, value) {
        if (authorizedRoles.write.includes(currentRole)) {
            target[property] = value;
            return true;
        }
        throw new Error('没有写入权限');
    },
    deleteProperty(target, property) {
        if (authorizedRoles.delete.includes(currentRole)) {
            delete target[property];
            return true;
        }
        throw new Error('没有删除权限');
    }
});

// 测试读取
console.log(proxy.accountBalance); 
// 测试写入
try {
    proxy.accountBalance = 1500; 
} catch (error) {
    console.error(error.message); 
}
// 测试删除
try {
    delete proxy.transactionHistory; 
} catch (error) {
    console.error(error.message); 
}