Я обновляю проект 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');
}
У кого-нибудь есть идеи, как решить эту проблему?