我是根据用户权限从数据库中获取菜单并将其显示到我的网页,但是如果我访问任何其他人没有访问权限的URL,则会打开该页面。 为此,我创建并调用了access_denied函数,该函数重定向用户的主页。 我从AuthController的构造函数调用了access_denied函数,因为AuthController在每个页面都被加载。
我使用了以下代码
AuthController
public function __construct()
{
$this->accessDenied();
}
public function accessDenied()
{
$url_segment1 = Request::segment(1);
$url_segment2 = Request::segment(2);
$url_segment = $url_segment1 . '/' . $url_segment2;
$user_data = Auth::user()->toArray();
$dadmin = array_keys($user_data['admin']);
//this is sample of array
// $user_data['admin'] => Array
// (
// [admin/roles] => 1
// )
if (!in_array($url_segment, $dadmin)) {
return redirect('/home');
}
}
但我收到了以下错误
Non-static method Illuminate\Http\Request::segment() should not be called statically, assuming $this from incompatible context
如果我使用了错误的流程,请建议我在主页上重定向未经授权的用户的正确方法。
答案 0 :(得分:1)
首先,您应该创建一个中间件。在命令提示符下键入:
php artisan make:middleware AccessDenyMiddleware
然后你去app / Http / Middleware / AccessDenyMiddleware.php并填写句柄函数{你自己的代码}
$url_segment1 = Request::segment(1);
$url_segment2 = Request::segment(2);
$url_segment = $url_segment1 . '/' . $url_segment2;
$user_data = Auth::user()->toArray();
$dadmin = array_keys($user_data['admin']);
//this is sample of array
// $user_data['admin'] => Array
// (
// [admin/roles] => 1
// )
if (!in_array($url_segment, $dadmin)) {
return redirect('/home');
}
但添加以下行
return $next($request); // If passed, proceed with the route
然后,在路线中,您应键入:
Route::get('/yoururlhere', ['middleware' => 'AccessDenyMiddleware', function() { /* Put your work here */ } ]);
有更好的方法。与授权一样,如果您使用的是Laravel 5.2
如果您使用的是Laravel 5,可能会更改默认的Authenticate中间件
答案 1 :(得分:1)
您可以使用中间件https://laravel.com/docs/5.2/middleware#introduction。
php artisan make:中间件RoleRouteMiddleware
您应该将该代码放在中间件“App \ Http \ Middleware \ RoleRouteMiddleware”的handle方法中,并使用$ request变量而不是facade请求。
中间件会将earch请求过滤到您的应用。
注册中间件,将其添加到app / Http / Kernel.php中的routeMiddleware数组
protected $routeMiddleware = [
....
'alias' => App\Http\Middleware\RoleRouteMiddleware::class,
];
然后在特定路线上使用它:
Route::get('admin/profile', ['middleware' => 'alias', function () {
//your code here
}]);
或路线gruoups:
Route::group(['middleware' => 'alias', function () {
//your filtered routes
}]);