Magento web API 區分三種不同的用戶類型:
> **Guest**: 能夠訪問 `anonymous` 資源
```xml
<resources>
<resource ref="anonymous" />
</resources>
```
> **Customer**: 能夠訪問 `self` 類型的資源
```xml
<resources>
<resource ref="self"/>
</resources>
```
> **Integrator: **能夠訪問 `acl.xml` 中定義好的特定資源
```xml
<resources>
<resource ref="Magento_Cms::save"" />
</resources>
```
<br />為了更好的理解上面的內容,我們需要理解 `<VendorName>/<ModuleName>/acl.xml` 和 `<VendorName>/<ModuleName>/webapi.xml` 的關聯關系,我們在 `acl.xml` 中定義對應的資源訪問權限,下面的內容是 <MAGENTO_DIR>/module-cms/etc/acl.xml 中的代碼:
```xml
<config>
<acl>
<resources>
<resource id="Magento_Backend::admin">
<resource id="Magento_Backend::content">
<resource id="Magento_Backend::content_elements">
<resource id="Magento_Cms::page" title="Pages">
<resource id="Magento_Cms::save" title="Save Page"/>
</resource>
</resource>
</resource>
</resource>
</resources>
</acl>
</config>
```
我們重點關注這里的 `Magento_Cms::save` 資源,Magento 將單個 `acl.xml` 文件合并成一個大的 ACL 樹形結構,我們能在 Magento 后臺的兩個地方看到這個樹形結構:
> - Role Resource tab of the System | Permissions | User Roles | Edit | Add New Role screen
> - The API tab of the System | Extensions | Integrations | Edit | Add New Integration screen:
<br /><br />在這兩個地方我們可以為管理員和特殊的 web API 集成用戶設定訪問權限。這并不是說標準的管理員沒法執行 WEB API,在鑒權類型的章節部分我們能看到他們的差別還是很明顯的。<br />
<br />這些資源自給并不做任何事情,僅僅在 `acl.xml` 文件中定義他們并不會使 CMS 頁面受到保護。 這里需要控制器介入,作為訪問控制的一種機制。搜索 `Magento_Cms::save` 字符能看到在 `Magento\Cms\Controller\Adminhtml\Page\Edit` 類中定義了 `const ADMIN_RESOURCE = 'Magento_Cms::save'` 。<br />
<br /> 常量 `ADMIN_RESOURCE` 的定義是在基類 `\Magento\Backend\App\AbstractAction` 中定義的,默認是 `const ADMIN_RESOURCE = 'Magento_Backend::admin'` ,該值在 `_isAllowed` 中的使用情況如下:
```xml
protected function _isAllowed()
{
return $this->_authorization->isAllowed(static::ADMIN_RESOURCE);
}
```
這里的 `AbstractAction` 類是 Magento 中其他很多 admin 控制器的基類,這也意味著控制器才是真正利用 `acl.xml` 文件中定義的資源的類。`acl.xml` 文件的主要目的是創建 ACL 樹形結構。這意味著任何一個人如果要訪問后臺的 `cms/page/edit` ,它必須擁有 `Magento_Cms::save` 的訪問權限。否則,`_isAllowed` 方法在讀取到 `ADMIN_RESOURCE` 后會返回 `false` 并拒絕對應 URL 的訪問。<br />
<br />對于 Web APIs,它不適用控制器,也就沒有對應的 `ADMIN_RESOURCE` 常量和 `_isAllowed` 方法,API 使用 `webapi.xml` 類定義 `routes` ,一起來看看 `<MAGENTO_DIR>/module-cms/etc/webapi.xml` 文件中 CMS 頁面保存相關的部分:
```xml
<routes>
<route url="/V1/cmsPage" method="POST">
<service class="Magento\Cms\Api\PageRepositoryInterface" method="save"/>
<resources>
<resource ref="Magento_Cms::page"/>
</resources>
</route>
<route url="/V1/cmsPage/:id" method="PUT">
<service class="Magento\Cms\Api\PageRepositoryInterface" method="save"/>
<resources>
<resource ref="Magento_Cms::page"/>
</resources>
</route>
</routes>
```
上面的路由定義將下面的幾部分綁定在了一起,`url` 和 `method` 參數指定了那個 URL 會觸發這個 `route` ,`service` 元素中的 `class` 和 `method` 參數指定了當路由被觸發時要執行的接口和方法。最后 `resource` 標簽中的 `ref` 指定了要執行的安全性檢查針對的是哪一個資源。如果一個用戶執行一個未經授權的 web API 請求,或者它不是一個擁有 `Magento_Cms::page` 資源的角色,對應的請求就不會執行到上面指定的方法。
customer 類型的用戶適合使用 widgets,Magento 的結算頁面就是一個很好的例子。整個結算就是一個完全使用 Ajax 的應用,這和普通的前臺界面比如 CMS、分類和產品頁面不同。
- Magento 基本概念
- Magento 中的 Plugin
- Magento 中的 Events 和 observers
- Magento 中的 Areas
- Magento 中的請求處理流程
- Magento 中的模塊(Modules)
- Magento 中的 Cache
- Magento 中的依賴注入
- Magento 中的 Console commands
- Magento 中的 Cron jobs
- 掌握 Entities
- 理解 model 的類型
- 理解 setup scripts
- 實體擴展
- 初入 web API
- users 的幾種不同類型
- 授權的不同類型
- APIs 的不同類型
- 使用 Magento 現有的 API
- 創建自定義 web APIs
- 理解 search criteria
- Magento 后臺開發
- 使用 listing 組件
- 使用 form 組件
- 開發前臺功能
- 搭建前臺開發環境
- 初始化 & 調用 JS 組件
- 開始使用 RequireJS
- 替換 jQuery widget 組件
- 擴展 jQuery widget 組件
- 創建 jQuery widgets 組件
- 創建 UI/KnockoutJS 組件
- 擴展 UI/KnockoutJS 組件
- 自定義 Catalog
- 創建參考尺寸
- 創建當天發貨
- 標識新產品
- Magento 性能最佳實踐
- Magento 硬件推薦配置
- 軟件推薦
- 架構參考
- 配置項最佳實踐
- 高級設置
- 其他
- 如何通過 Burp Suite 和 Xdebug 來調試 Magento
- Mageno checkout 必知必會
- Magento 安裝(新手必看)
- 安裝流程
- 系統要求