九月 21, 2019 | 後端和Drupal
【D8 Hardcode教學】如何改變特定頁面之瀏覽權限
前言
由於案子開發上的需要,會需要在特定頁面上要有特殊的瀏覽權限。一般模組難以達到客戶想要的邏輯,因此,就會需要使用RouteSubscriber搭配alterRoutes來處理對應的邏輯,進而達到我們想要的動態更改特定頁面之瀏覽權限的效果。
建立模組與建立Services
建立一個客製化模組之後,請在您的模組內,建立一個services的宣告
1. 建立一個 mymodule.services.yml
services:
mymodule.route_subscriber:
class: Drupal\mymodule\Routing\RouteSubscriber
tags:
- { name: event_subscriber }
2. 建立RouteSubscriber
宣告完畢一個services之後,就需要建立其對應的服務, 因此,在以下路徑建立一個檔案。檔名與路徑都需要遵守規範。
mymodule/src/Routing/RouteSubscriber.php
RouteSubscriber.php
<?php
/**
* @file
* Contains \Drupal\mymodule\Routing\RouteSubscriber.
*/
namespace Drupal\mymodule\Routing;
use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;
/**
* Listens to the dynamic route events.
*/
class RouteSubscriber extends RouteSubscriberBase
{
/**
* {@inheritdoc}
*/
public function alterRoutes(RouteCollection $collection)
{
if ($route = $collection->get('user.pass')) {
$route->setRequirement('_custom_access', '\Drupal\mymodule\Access\ResetPasswordAccessCheck::access');
}
}
}
備註:
這裡的路徑是針對找回密碼這個頁面,進行客製化權限管控。這裡會需要用到 alterRoutes的方法,在這裡重新設定了_custom_access,並且指定到我們專門控制客製化權限的另外一個服務 \Drupal\mymodule\Access\ResetPasswordAccessCheck::access
setRequirement 第二個參數的確是要帶入字串,不要覺得我這裡是筆誤唷。
3. 建立客製化Access
我們現在需要建立一個ResetPasswordAccessCheck的Class在Access之下,並且用這一支程式來進行這個路徑的權限管控。
請在以下路徑建立
mymodule/src/Access/ResetPasswordAccessCheck.php
ResetPasswordAccessCheck.php
<?php
namespace Drupal\mymodule\Access;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\AccessResult;
class ResetPasswordAccessCheck
{
public function access(AccountInterface $account)
{
//This is my access logic
if($condition=='A'){
$access=true;
}else{
$access=false;
}
return $access ? AccessResult::allowed() : AccessResult::forbidden();
}
}
在access的function裡面,就可以進行邏輯的判斷,並且給予適當的權限囉
結論
對於複雜的網站網站來說,常常需要搭配不同的權限來決定網頁是否能夠被看到,這個方法非常的實用,學起來可以應付非常多種的情況。而這篇的重點是在於更改藉有的路徑權限,而當然今天若是客製化的路徑或是一些模組產生的頁面,往往都已經有了權限與角色可以操控了,就不用如此複雜的方法囉。希望可以幫助到一些未來需要用到的人。有任何問題,歡迎再留言討論~