我想在运行动作之前检查auth。如果用户拒绝,我将回复403状态。
我使用__construct中的方法函数来检查。
代码如下。
用户控制器:
public function __construct()
{
if (!app()->runningInConsole()) {
$beforeMethod = \Route::getCurrentRoute()->getActionMethod()."before";
if (method_exists($this, $beforeMethod)) {
return $this->$beforeMethod();
}
}
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return "success";
}
/**
* Check user Auth
*
* @return \Illuminate\Http\RedirectResponse
*/
public function editBefore()
{
$id = \request()->route('user');
if (Gate::denies('edit', User::find($id))) {
return redirect("login");
}
}
上面的代码,不要返回登录。
我应该用什么代码来实现我的目的?谢谢!
答案 0 :(得分:0)
你真的很接近我会做的事情。我会使用Policies。
您可以将这些添加到路由或路由组,以便在它到达控制器方法之前检查策略。
创建一个类似于:
的新策略类class UserPolicy
{
public function canEdit(User $user) // this user is the logged in user
{
// Here you return true or false depending on whether they can edit or not.
return $user->isAllowedToEdit();
}
}
然后确保将该政策添加到AuthServiceProvider.php
:
public function boot(GateContract $gate)
{
$gate->define('user.edit', UserPolicy::class.'@canEdit');
// Additional policies
}
然后确保将can
添加到$routeMiddleware
中的Kernel.php
:
protected $routeMiddleware = [
// other middleware
'can' => \Illuminate\Auth\Middleware\Authorize::class,
];
最后,您可以将其添加到路线中,确保使用您在AuthServiceProvider
中定义的相同名称:
Route::get('/user/edit')
->uses('UserController@edit')
->middleware('can:user.edit');
我个人喜欢这样做,因为它清理控制器并让策略完成所有工作"幕后操作"。更好的是,您可以对多个路由使用相同的users.edit
策略。