为 Drupal8 站点添加简单的 HTTP Authentication(翻译)

蒲公英 提交于 周三, 08/17/2016 - 10:45
为 Drupal8 站点添加简单的 HTTP Authentication

很多时候你会需要对站点进行密码保护(典型的通过 HTTP Authentication),例如我在线构建一个客户开发环境,但不希望这个内容被搜索引擎收录。  

当然你可以通过配置 Apache 来实现,但这里有个简单的方法,3 步实现:

  1. 改变 .htaccess,允许验证;
  2. 向 settings.php 添加个函数;
  3. 调用上述函数。

这个方法的好处就是简单,能基于项目单独配置。  

步骤一: 向 .htaccess 添加以下代码(最后的 </IfModule> 前面)

# Password protection.
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

步骤二: 向 settings.php 添加函数

/**
 * Password protect the site with a single function.
 */
function secure_the_site_please($username = 'monkey', $password = 'monkey', 
                                $message = 'This site is protected') {
    // Password protect this site but ignore drush and other command-line
    // environments.
    if (php_sapi_name() != 'cli') {
        // PHP-cgi fix.
        $a = base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6));
        if ((strlen($a) == 0) || (strcasecmp($a, ":") == 0)) {
            header('WWW-Authenticate: Basic realm="Private"');
            header('HTTP/1.0 401 Unauthorized');
        }
        else {
            list($entered_username, $entered_password) = explode(':', $a);
            $_SERVER['PHP_AUTH_USER'] = $entered_username;
            $_SERVER['PHP_AUTH_PW'] = $entered_password;
        }
        if (!(isset($_SERVER['PHP_AUTH_USER']) && 
             ($_SERVER['PHP_AUTH_USER'] == $username && $_SERVER['PHP_AUTH_PW'] == $password))) {
            header('WWW-Authenticate: Basic realm="' . $message . '"');
            header('HTTP/1.0 401 Unauthorized');
            // Fallback message when the user presses cancel / escape.
            echo 'Access denied';
            exit;
       }
    }
}

步骤三:在 settings.php 内执行上述函数,设置口令。

secure_the_site_please('test', 'test');

原文