首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >瘦3日志中间件进入循环

瘦3日志中间件进入循环
EN

Stack Overflow用户
提问于 2018-06-22 09:45:35
回答 2查看 475关注 0票数 0

我有一些问题的苗条3登录中间件。在我尝试的任何路径中,我都会收到这个浏览器错误:"ERR_TOO_MANY_REDIRECTS“。似乎SLIM进入了一个循环,无法呈现登录页面。我能做什么?显然,我已经完成了会话变量的print_r,当然,它最初是空的,只有在正确的登录之后才会填充。

这是我的索引php:

代码语言:javascript
运行
复制
<?

use Slim\Views\PhpRenderer;

session_start();

define( "BASE_URL", "/test/");
define("ROOT_PATH", $_SERVER["DOCUMENT_ROOT"] . "/test/");

require 'vendor/autoload.php';
require 'config/db.php';
require('functions/middleware.php');

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule;
$capsule->addConnection([
    'driver' => 'mysql',
    'host' => DB_HOST,
    'port' => DB_PORT,
    'database' => DB_NAME,
    'username' => DB_USER,
    'password' => DB_PASSWORD,
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
]);

$capsule->bootEloquent();
$capsule->setAsGlobal();

$config['displayErrorDetails'] = true;
$config['addContentLengthHeader'] = false;
$config['determineRouteBeforeAppMiddleware'] = true;

$app = new \Slim\App(['settings' => $config]);

$container = $app->getContainer();
$container['renderer'] = new PhpRenderer("./templates");
$container['notFoundHandler'] = function ($container) {
    return function ($request, $response) use ($container) {
        return $container['renderer']->render($response, "/404.php");
    };
};

// Apply the middleware to every request.
$app->add($loggedInMiddleware);

include 'routes.php';

$app->run();

这是包含文件的中间件:

代码语言:javascript
运行
复制
<?
// Check the user is logged in when necessary.
$loggedInMiddleware = function ($request, $response, $next) {

    $route = $request->getAttribute('route');
    $routeName = $route->getName();
    $groups = $route->getGroups();
    $methods = $route->getMethods();
    $arguments = $route->getArguments();

    # Define routes that user does not have to be logged in with. All other routes, the user
    # needs to be logged in with.
    $publicRoutesArray = array(
        'login',
        'logout'
    );

    if (!$_SESSION && !in_array($routeName, $publicRoutesArray)) {

        // redirect the user to the login page and do not proceed.
        $response =  $response->withRedirect('/test/login');

    } else {

        if ($routeName == "login")
            return $response->withRedirect('/test/dashboard');

        // Proceed as normal...
        $response = $next($request, $response);
    }

    return $response;
};

这些是GET和POST登录路径:

代码语言:javascript
运行
复制
$app->get('login', function ($request, $response, $args) {

        return $this->renderer->render($response, "/login.php", $args);

    })->setName('login');

$app->post('login', function ($request, $response, $args) {

    $res = [];

    if(!$_POST['username'] || !$_POST['password']) {
        $res['error'] = "Inserisci i campi richiesti per il LogIn";
        return $this->response->withJson($res);
    }

    $thisUser = \test\Model\users::select("users.*")
        ->where("username",$_POST['username'])
        ->where("password",MD5($_POST['password']))
        ->get();

    if (!$thisUser[0]){
        $res['error'] = "I dati inseriti non corrispondono a nessun utente";
        return $this->response->withJson($res);
    }

    $_SESSION['user']['id'] = $thisUser[0]['id'];
    $_SESSION['user']['username'] = $thisUser[0]['username'];
    $_SESSION['user']['role'] = $thisUser[0]['role'];
    $_SESSION['user']['name'] = $thisUser[0]['name'];
    $_SESSION['user']['profileImg'] = "https://www.media-rdc.com/medias/32d9119760683046ad0c1e2d7e50e009/p_50x50/stsm144.jpg";

    $res['success'] = true;

    return $this->response->withJson($res);

});

最后,这是我的.htaccess:

代码语言:javascript
运行
复制
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-22 15:34:23

嗯,我尝试过很多事情;我不确定这是否是正确的答案,但它解决了这个问题(至少在我这边是这样):

我已经修改了你的中间程序

代码语言:javascript
运行
复制
<?php
function (\Slim\Http\Request $request, \Slim\Http\Response $response, $next) {

    $route = $request->getAttribute('route');

    if (empty($route)) {
        throw new \Slim\Exception\NotFoundException($request, $response);
    }

    $routeName = $route->getName();

    // Define routes that user does not have to be logged in with. All other routes, the user
    // needs to be logged in with.
    $publicRoutesArray = array(
        'login',
        'logout'
    );

    if ( empty($_SESSION['user']) && !in_array($routeName, $publicRoutesArray)) {
        // redirect the user to the login page and do not proceed.
        return $response->withRedirect('/test/login');
    }

    // Proceed as normal...
    return $next($request, $response);
}
?>

此外,您似乎必须将test包含在所定义的工作路由中(或者在.htaccess中过滤掉它们)。

代码语言:javascript
运行
复制
<?php
$app->get('/test/login', function ($request, $response, $args) {

    return $this->renderer->render($response, 'index.phtml', $args);

})->setName('login');
?>

我真心希望它能帮上忙

票数 1
EN

Stack Overflow用户

发布于 2018-06-22 16:44:13

您有一个会话,因为您从一开始就开始会话:

代码语言:javascript
运行
复制
<?

use Slim\Views\PhpRenderer;

session_start();
...

您的中间件只是检查是否存在会话,而不是您是否从用户登录中设置了user会话变量。

代码语言:javascript
运行
复制
if (!$_SESSION && !in_array($routeName, $publicRoutesArray)) {

    // redirect the user to the login page and do not proceed.
    $response =  $response->withRedirect('/test/login');

} else {

    if ($routeName == "login")
        return $response->withRedirect('/test/dashboard');

    // Proceed as normal...
    $response = $next($request, $response);
}

因此,当他们到达登录路径时,应用程序将进入there语句(并且没有登录),这将将他们重定向到仪表板(非常肯定这是“错误的”,因为您希望他们留在那里提交一份表单进行登录)。当他们点击仪表板时,该路由不是公共路由的一部分,因此它将它们重定向回登录页面。因此,这种循环将永远持续下去。

也许改变:

代码语言:javascript
运行
复制
if (!$_SESSION && in_array($routeName, $publicRoutesArray) === FALSE) {

    // redirect the user to the login page and do not proceed.
    $response = $response->withRedirect('/test/login');

} else {

为了..。

代码语言:javascript
运行
复制
if (!isset($_SESSION['user'] && in_array($routeName, $publicRoutesArray) === FALSE) {

    // redirect the user to the login page and do not proceed.
    $response = $response->withRedirect('/test/login');

} else {
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50985215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档