Ролева автентификация и привилегии в Slim 3

Приложих междинен софтуер за определяне на ролята и валидността на потребителския токен, изпратен в заглавката на заявката.

<?php
namespace App\Middleware;


class AuthenticationMiddleware extends Middleware {


//Invoke magic method for all middlewares in Slim
//Next is the next middle
public function __invoke($request, $response, $next) {

    $role = $this->container->authentication->isAuthenticatedForAdminSite($request);
     //$role  = 'Admin';
     if(!isset($role)) { 
        return $response->withRedirect('login'); 
     }
    $this->container->authentication->adminRole = $role;
    $response = $next($request, $response);
    return $response;
}
}

Следната функция връща името на ролята (администратор, модератор, клиент и т.н.)

$this->container->authentication->isAuthenticatedForAdminSite($request)

Ако не върне нищо, потребителят се пренасочва към страницата за вход, ако не, трябва да запазя стойността на to role в ivar adminRole при удостоверяване. Причината е, че когато изобразявам страницата си, трябва да определя вида на ролята, за да реша какъв вид навигационна лента трябва да показва страницата.

Проблемът възниква в контролера за функцията за маршрутизиране.

public function getOrders($request, $response) {
    $role = $this->container->authentication->adminRole;

    return $this->container->view->render($response, 'orders.html', ['orders' => getOrdersForAdmin("%", $this->container->db), 'role' => $role]);
}

$role винаги е NULL, когато тествам приложението на моя споделен хост, но работи добре, когато тествам приложението на localhost.


person Ilker Baltaci    schedule 13.06.2017    source източник


Отговори (1)


Лоша практика е да давате на услуги (които извличате от контейнера) произволно състояние. Въпреки че съм малко изненадан, че не работи без грешка, по-често би било да присвоите ролята, която получавате, на заявката:

// AuthenticationMiddleware
$response = $next($request->withAttribute('role', $role), $response);

След това, по-късно във вашия контролер със заявката, която е достъпна от контейнера:

$request->getAttribute('role');
person Scopey    schedule 13.06.2017
comment
Благодаря ви за съвета. Преработих кода си и определено е по-добър модел на проектиране, особено когато използвате междинен софтуер. - person Ilker Baltaci; 14.06.2017