2015-12-30 5 views
2

Я использую Laravel 5.1. Мой контроллер специально предназначен для пользователей admin. Поэтому я проверяю, является ли пользователь администратором или нет. Это мой код.Laravel Перенаправление не работает

public function getAdminData() 
    { 
    $this->checkAdminStatus(); 
    return response()->json(array('admin-data')); 
    } 
public function checkAdminStatus() 
    { 
    $userManager = new UserManager(); 
    if(!$userManager->isAdmin()) 
    { 
     return redirect()->route('returnForbiddenAccess'); 
    } 
    } 

Мой маршрут

Route::any('api/app/forbidden',['uses' =>'[email protected]','as'=>'returnForbiddenAccess']); 

Теперь, если пользователь не администратор, то он не должен возвращать admin-data пока она возвращается. Не следует ли прекратить обработку логики после вызова redirect()->route? Также это чисто приложение REST.

+0

Почему вы проверяете, является ли кто-то администратором вашего контроллера, если этот контроллер предназначен только для администраторов? Используйте промежуточное программное обеспечение, которое будет проверять вас, и если кто-то будет аутентифицирован и авторизирован - пропустите их до контроллера. В противном случае отправьте их на страницу авторизации. Эта логика не выполняется в контроллерах, это делается в промежуточном программном обеспечении, как и в ответ Jiedara. – Mjh

ответ

3

Почему бы вам не использовать решение Laravel Middleware для ваших потребностей? Вы можете связать промежуточное программное обеспечение к контроллеру, проверяя, если текущий пользователь является администратором, и перенаправлять если нет:

//You Middleware Handle method 
public function handle($request, Closure $next) 
{ 
    if ($this->auth->guest() || !($this->auth->user()->isAdmin)) 
    { 
     return redirect('your/url')->with('error','no admin');; 
    } 
return $next($request); 
} 

Вы можете добавить на или несколько промежуточное программное обеспечение для контроллера в его методе конструкта

//your controller 
public function __construct(Guard $auth, Request $request){ 
    $this->middleware('auth', ['except' => ['index', 'show']]); //here one 'auth' middleware 
    $this->middleware('admin', ['only' => ['index', 'show', 'create','store']]); //here the admin middleware 
} 

Обратите внимание на only и except параметров, которые позволяют или запретить промежуточное программное обеспечение для некоторых методов контроллера

Проверить laravel documentation на Middleware для получения дополнительной информации :)

+0

Хм, кажется, это правильный способ сделать это, можете ли вы сказать мне, как добавить более одного промежуточного программного обеспечения в контроллер? –

+0

@SachinSharma Я просто редактирую свой ответ, если вы хотите :) – Jiedara

1

Нет, ваша логика немного испорчена. Возвращаемое значение вы отправляете обратно из checkAdminStatus() просто игнорируется и выбрасывались:

public function getAdminData() 
{ 
    // You don't have $redirectValue in your code, but imagine it 
    // is there. To actually redirect, you need to return this value 
    // from your controller method 
    $redirectValue = $this->checkAdminStatus(); 

Ничто не делается с этим редиректа. только время что-то возвращается с вашего Контроллер происходит по каждому отдельному запросу. Я хотел бы предложить что-то больше, как это:

public function getAdminData(UserManager $userManager) 
{ 
    if($userManager->isAdmin()) { 
     return response()->json(array('admin-data')); 
    } 

    return redirect()->route('forbidden-access'); 
} 

Я думаю, что это захватывает дух ваш вопрос: единственный раз, когда что-то возвращается здесь , если пользователь является администратором.


Как и в сторону, вы возвращаете данные JSON в одном случае, и перенаправления в другой. Это может быть не очень хорошая идея. Мое рассуждение состоит в том, что, как правило, данные JSON возвращаются в ответ на запросы AJAX, которые по моему опыту редко сопровождаются фактическим перенаправлением в случае сбоя. (YMMV)

+0

Фактически ранее я делал это только. Но тогда я бы снова переписал этот же код в этом контроллере, и я пытался применить принцип DRY. Что делать, если я внедряю в него промежуточное ПО, поскольку это является общим для всего контроллера? –

+0

Да, если этот код будет использоваться снова и снова, имеет смысл помещать его в промежуточное программное обеспечение. Я отрицал бы оператор if в этом случае ('if (!$ manager-> isAdmin()) '), а затем возвращает только перенаправление в этом случае. В вашем контроллере вы просто возвращаете данные администратора JSON. –

+0

Хм да, также вы можете сказать мне, могу ли я добавить к моему контроллеру больше, чем промежуточное ПО, если да, то как? –

Смежные вопросы