如果用户无权访问其无法正常工作的页面,则将用户重定向到主页

时间:2018-02-19 17:46:54

标签: laravel

如果用户创建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');

    }
 }

1 个答案:

答案 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');
}