如果用户创建ID为“2”的会议,则应允许他访问“proj.test / conference / manage / 2”。
但是如果用户未经过身份验证,则应将未创建ID为“2”的会议的用户重定向到登录页面。如果他经过身份验证,则应重定向到主页。
但是它不能正常工作,如果用户创建了ID为2的会议,他可以访问“proj.test / conference / manage / 2”但是如果访问“proj.test / conference /”则没有创建此会议的其他用户管理/ 2“它出现了错误:
This action is unauthorized.
因此,不是将用户重定向到主页,而是显示此错误。你知道为什么不工作吗?
我有存储方法,在存储会议后,用户被重定向到管理区域以管理该特定会议,例如,管理ID为2的会议,用户被重定向到“proj.test / conference / manage” / 2" 。
存储方式:
public function store(Request $request)
{
$this->validate($request, [
'conference_name' => 'required|max:255|string',
...
]);
$conference = Conference::create([
'name' => $request->conference_name,
...
]);
}
然后在AuthServiceProvider中添加:
public function boot(GateContract $gate)
{
$this->registerPolicies();
$gate->define('access-management-area', function($user, $conference)
{
return $user->id == $conference->conference_creator_id;
});
}
在管理方法中我有:
public function manage($id){
$conference = Conference::findOrFail($id);
if($this->authorize('access-management-area', $conference)){
return view('conferences.manage')->with('myconference',$conference);
}
else{
return redirect('/home');
}
}
答案 0 :(得分:0)
请勿使用$this->authorize
,因为它与Gate::allows()/denies()
的工作方式不同。
如果authorize
方法失败,它将抛出exception
,为了条件比较,它不会返回false
。
来自文档:
如果操作未经授权,则authorize方法将抛出Illuminate \ Auth \ Access \ AuthorizationException,默认的Laravel异常处理程序将转换为具有403状态代码的HTTP响应。
因此,请使用Gate::denies
进行比较。
if(Gate::allows('access-management-area', $conference)) {
return view('conferences.manage')->with('myconference',$conference);
} else {
return redirect('/home');
}