我无法在文档中找到它。如何重定向未授权用户?
RolePolicy.php
class RolePolicy
{
use HandlesAuthorization;
public function manageRoles(User $user)
{
return $user->isAdmin();
}
}
RolesController.php
function __construct()
{
$this->authorize('manageRoles', Role::class);
}
提前致谢
答案 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');
}
答案 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);
}
});
}