Laravel HTTP перенаправление в вызове API контроллера - PullRequest
0 голосов
/ 11 марта 2020

Я обновляю проект Laravel 5.2, чтобы ограничить доступ на основе массива разрешенных пользовательских идентификаторов, которые я извлекаю из токена SSO. Настройка моего приложения такова, что существует специальный класс промежуточного программного обеспечения, созданный для обработки SSO. Я хочу, чтобы пользователи, чьи идентификаторы были в ограниченном массиве, не имели доступа к определенным страницам. Он работает наполовину: пользователи, чьи идентификаторы считаются ограниченными, могут разрешить доступ к массиву страниц. Однако на этих страницах используются вызовы API, и хотя пользователи могут получить доступ к этим страницам, при просмотре их страницы нарушаются из-за ограничения вызовов API.

Вот соответствующий фрагмент кода в моем промежуточном ПО:

    //Check to see if user is limited access user
    $user_id = $request->server('ssotokenid');
    if(in_array($user_id, $this->restrictedUsers))
    {

        //If restricted user, ensure that requested page is within allowable access array
        $uri = $request->path();

        //If allowed page
        if(in_array($uri, $this->allowedPagesArray))
            return $next($request);
        else
            return redirect('/restricted-landing-page');
    }
    //Continue on to oher stuff here...this works fine

Вот пример страницы в моем маршруте. обратите внимание, что я использую метод контроллера вместо get:

Route::controller('/subdashboard/subpage', 'Dashboard\PageController');

Вот пример некоторых методов в этом контроллере:

class PageController extends DataController
{
    protected $dashboard = 'my-dashboard';
    protected $page = 'my-page';
    private $table = 'my-db-table';


    /**
     * Render page
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\View\View
     */
    public function getIndex()
    {
        return view("$this->dashboard/$this->page", [
            'appUrl'    =>  $this->rootPath,
        ]);    
    }

    /**
     * An example method and first API call that runs when the page loads
     * @param none
     * @return array
     */
    public function getData()
    {
        $data= $this->db->table($this->table)
            ->lists('myfield');

        return response()->json($data);
    }

Мой файл просмотра страницы тянет в js файл. Первое, что загружается, - это вызов API метода getData в контроллере. Пример:

function init()
{
        //This should call the getData method in the above controller
        //This fails here
        $.getJSON(apiURL + '/data/')
        .done( function(returnData) {

            //do stuff with json response

        })
}

Вышеприведенный вызов API завершается неудачно, поскольку HTTP-запрос разрешается по URL-адресу разрешенной страницы / данных. Пользователь может go перейти на разрешенную страницу, но после этого ничего не получается, потому что вместо выборки данных из разрешенной страницы / данных, запрос перенаправляется на страницу с ограниченным доступом.

Я пытался использовать strpos, чтобы определить, содержит ли URL разрешенную страницу, но это не работает.

        //If allowed page
        if(in_array($uri, $this->allowedPagesArray))
            return $next($request);
        else
        {
            foreach($this->allowedPagesArrayas $page) 
            {
                if(strpos($page, $uri) !== false)
                    return $next($request);
            }

            return redirect('/restricted-landing-page');
        }

У кого-нибудь есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 11 марта 2020

Я идиот. Я использовал параметры в strpos () в неправильном порядке. Когда я это исправил, все работает нормально. Кроме того, мне пришло в голову, что я могу избавиться от сравнения in_array и просто использовать strpos.

Так что вместо этого ...

    //If allowed page
    if(in_array($uri, $this->allowedPagesArray))
        return $next($request);
    else
    {
        foreach($this->allowedPagesArrayas $page) 
        {
            if(strpos($page, $uri) !== false)
                return $next($request);
        }

        return redirect('/restricted-landing-page');
    }

Я обновил его до этого:

   foreach($this->allowedPagesArrayas $page) 
   {
       if(strpos($uri, $page) !== false)
          return $next($request);
   }

   return redirect('/restricted-landing-page');
...