我正在使用Laravel 5.1。我的控制器专门用于管理员用户。所以我检查用户是否是管理员。这是我的代码。
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' =>'ErrorController@returnNonAdminErrorStatus','as'=>'returnForbiddenAccess']);
现在,如果用户不是管理员,那么它不应该返回admin-data
,而是返回。在redirect()->route
通话后它不应该停止处理逻辑吗?
这也是纯粹的REST应用程序。
答案 0 :(得分: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以获取更多信息:)
答案 1 :(得分: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)子>