• Salesforce 的 Locker Service 简介


    Salesforce 从 Winter'17 版本开始在 Lightning 框架中引入了 Locker Service 机制。

    Locker Service 机制的引入可以增强 Lightning 应用的安全性。

    Locker Service 的作用

    Lightning 的应用本质上是 JavaScript 应用,其中包含了由各种 HTML 页面元素组成的“文档对象模型树”(DOM Tree,参考官方定义)。

    与此同时,Lightning 应用是组件化的,来自不同开发者的组件可以以 DOM 的形式存在于同一个应用页面中。如果没有任何的防护措施,这些 DOM 是可以互相访问的,从而带来安全隐患。

    在 Lightning 框架中,不同来源的组件是由命名空间(namespace)来确定的,比如标准的组件有 “ui:button”、“lightning:select” 等,它们就属于不同的命名空间。

    Locker Service 的主要作用就是提供了虚拟的 DOM 元素,将不同命名空间的组件封装起来,限制它们之间的访问。

    封装组件

    Locker Service 中预定义了一些安全组件,将实际的 DOM 封装起来,比如:

    • SecureComponent:将同一命名空间下的 Component 元素封装起来
    • SecureComponentRef:另一命名空间下的 Component 元素
    • SecureWindow:将 window 元素封装起来
    • SecureDocument:将 document 元素封装起来

    代码示例

    我们通过一段代码来看看实际应用的情况。

    Lightning 组件:

    <aura:component >
        <!-- 定义一个 div 元素 -->
        <div id="idDiv" aura:id="idDiv">
            <p>Hello World!</p>
        </div>
    
        <!-- 定义一个 lightning 命名空间下的 button 元素 -->    
        <lightning:button name="button" label="click here" aura:id="idButton" onclick="{!c.handleClick}" />
    </aura:component>
    

    相应的控制器代码:

    ({
    	handleClick : function(component, event, helper) {
            debugger;
    	},
    })
    

    在用户点击按钮之后,JavaScript 的 debugger 语句可以让我们在控制台中进行断点调试。

    现在我们执行一些命令:

    命令:

    window+''
    

    结果:

    "SecureWindow: [object Window]{ key: {"namespace":"c"} }"
    

    解释:

    我们想要显示 window 元素,可以看到结果中给出的是 SecureWindow 元素,也就是说原始的 window 元素已经被封装起来了。

    命令:

    component.find('idDiv')+''
    

    结果:

    "SecureComponent: markup://aura:html {5:0} {idDiv}{ key: {"namespace":"c"} }"
    

    解释:

    我们想要显示 div 元素,结果可以看到它已经被封装到了 SecureComponent 元素中,其命名空间是 “c”,这是基本 HTML 元素的默认命名空间。

    命令:

    component.find('idButton')+''
    

    结果:

    "SecureComponentRef: markup://lightning:button {8:0} {idButton}{ key: {"namespace":"c"} }"
    

    解释:

    我们想要显示 lightning:button 元素,结果可以看到它已经被封装到了 SecureComponentRef 元素中,其命名空间是 “c”。lightning:button 元素本身的命名空间是 “lightning”,但是现在它被引用到了命名空间是 “c” 的组件中,所以类型是 SecureComponentRef。

    命令:

    component.find('idButton').getElement()+''
    

    结果:

    Uncaught TypeError: component.find(...).getElement is not a function
    

    解释:

    我们想要显示 lightning:button 元素中的内容,结果出错了,原因就是它属于命名空间 “lightning”,而我们所处的组件是属于命名空间 “c”,Locker Service 限制了它们之间的访问。

  • 相关阅读:
    Tomcat + Mysql高并发配置优化
    Qt Widget 利用 Qt4.5 实现酷炫透明窗体
    使用VC2005编译真正的静态Qt4.4.3程序 good
    详解 Qt 线程间共享数据(使用signal/slot传递数据,线程间传递信号会立刻返回,但也可通过connect改变)
    浅析在QtWidget中自定义Model(beginInsertRows()和endInsertRows()是空架子,类似于一种信号,用来通知底层)
    英国著名芯片厂商与苹果谈崩 中资收购机会来了!
    跨站脚本攻击(XSS)
    Kafka 协议实现中的内存优化
    读取配置信息
    英语面试准备
  • 原文地址:https://www.cnblogs.com/chengcheng0148/p/locker_service_intro.html
Copyright © 2020-2023  润新知