九月 21, 2019 | 後端和Drupal

【D8 Hardcode教學】如何改變特定頁面之瀏覽權限

由於案子開發上的需要,會需要在特定頁面上要有特殊的瀏覽權限。一般模組難以達到客戶想要的邏輯,因此,就會需要使用RouteSubscriber搭配alterRoutes來處理對應的邏輯,進而達到我們想要的動態更改特定頁面之瀏覽權限的效果。

前言

由於案子開發上的需要,會需要在特定頁面上要有特殊的瀏覽權限。一般模組難以達到客戶想要的邏輯,因此,就會需要使用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');
        }
    }
}

備註:

  1. 這裡的路徑是針對找回密碼這個頁面,進行客製化權限管控。這裡會需要用到 alterRoutes的方法,在這裡重新設定了_custom_access,並且指定到我們專門控制客製化權限的另外一個服務 \Drupal\mymodule\Access\ResetPasswordAccessCheck::access

  2. 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裡面,就可以進行邏輯的判斷,並且給予適當的權限囉

結論

對於複雜的網站網站來說,常常需要搭配不同的權限來決定網頁是否能夠被看到,這個方法非常的實用,學起來可以應付非常多種的情況。而這篇的重點是在於更改藉有的路徑權限,而當然今天若是客製化的路徑或是一些模組產生的頁面,往往都已經有了權限與角色可以操控了,就不用如此複雜的方法囉。希望可以幫助到一些未來需要用到的人。有任何問題,歡迎再留言討論~