Laravel 5.3政策如何重定向未经授权的用户

时间:2016-09-17 14:11:26

标签: php acl laravel-5.3

我无法在文档中找到它。如何重定向未授权用户?

RolePolicy.php

class RolePolicy
{
    use HandlesAuthorization;

    public function manageRoles(User $user)
    {
        return $user->isAdmin();
    }
}

RolesController.php

function __construct()
{
    $this->authorize('manageRoles', Role::class);
}

提前致谢

4 个答案:

答案 0 :(得分:8)

您可以修改文件app\Exceptions\Handler.php

在渲染函数上:

public function render($request, Exception $e)
{

    /**modified part**/  
    if ($request->wantsJson()) {
        return response([
            'success' => false,
            'message' => $e->getMessage()
        ], 404);
    }

    if ($e instanceof AuthorizationException) {
        return redirect('path');

        //or simply
        return view('errors.forbidden');
        //but this will return an OK, 200 response.
    }
    /**end of modified part**/

    return parent::render($request, $e);
}

如果要放置403,请使用辅助函数response()。 您可以在此处查看回复文档https://laravel.com/docs/master/responses

  

基本上,您可以使用该解决方案来玩更多选项。但最简单的方法是创建一个视图文件:errors/403.blade.php,当您遇到未经授权的异常时,该视图将自动加载。同样适用于404未找到,只需创建404.blade.php

答案 1 :(得分:2)

据我所知,Laravel 5.3与Laravel 5的任何版本都没有区别。

有一个名为auth的路由中间件引用App\Http\Middleware\Authenticate(在app / http / Kernel.php中定义)

在这堂课中:

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->guest()) {
        if ($request->ajax()) {
            return response('Unauthorized.', 401);
        } else {
            return redirect()->guest('login');
        }
    }

    return $next($request);
}

auth中间件可应用于需要身份验证的路由。

在此处详细了解中间件:https://laravel.com/docs/5.3/middleware

在此处详细了解身份验证:https://laravel.com/docs/5.3/authentication

答案 2 :(得分:0)

在您的控制器方法中使用Laravel Gates。例如:

fi.getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // Now you can make calls to fragment here like:
        args.putInt(cf_Fragment_MainDriver1.ARGS1_MainDriver1, i);
        fi.setArguments(args);
    }
});

但是,我个人认为为每个控制器操作设置重定向页面太麻烦了。如果该操作被拒绝,则是因为用户操纵了url,而不是因为某些先决条件还没有完成,那么带有Home按钮的纯404页面就足够了。

就像上面的答案所说的那样,使用Laravel响应更好,更容易,调用所需的错误页面并传递自定义消息。

喜欢来自另一个线程的答案:

public function update(Role $role){

if(\Gates::allows('manageRoles',$role)) {

return redirect()->back()->with('status','Success');

}

https://stackoverflow.com/a/38611737/6131033

答案 3 :(得分:0)

我实现了一些逻辑,希望对您有所帮助。
首先,调用例如$this->anonymouslyAuthorize($model)
的方法 在您的PostController之类的方法中

public function show(Post $post)
{
    $this->anonymouslyAuthorize($post);

    // The user is authorized.
}

在留下Controllers目录的基本控制器中,添加此方法。

public function anonymouslyAuthorize($model)
{
    Auth::user()->can('see', $model);
}
在引导方法的AuthServiceProvider中

定义此Gate。

public function boot()
{
    $this->registerPolicies();

    Gate::define('see', function ($user, $model) {
        if ($user->id !== $model->user_id) {
            abort(404);
        }
    });
}