当前位置: 首页 > 知识库问答 >
问题:

验证Laravel中的用户角色并保护路由

柳修为
2023-03-14

我从这里的人那里得到了建议,并尝试了一下,我一直在尝试创建一个用户身份验证系统。我很难用雄辩的语言将我所知道的在PHP中工作的东西翻译成Laravel。

我在这里尝试做的是识别用户,他们的角色,如果用户有管理员的角色,他们可以访问路由 /admin

我知道我可以使用诸如委托之类的软件包,但这并不能真正帮助我学习。

我已经为用户和角色创建了模型。我还有一个名为role\u user的查找表,其中包含一个user\u id和role\u id。

在你ser.php我有

public function roles(){

    return $this->belongsToMany('Role', 'users_roles');

}

在Role.php我有

public function users()
{
    return $this->belongsToMany('User', 'users_roles');
}

我知道如果我用过

$roles = user::find(1)->roles;
return ($roles);

它将返回正确的用户id(1)和分配给该用户的角色。现在我正在努力解决的是如何选择管理员角色,并且只有当用户拥有这个角色时,它才允许访问/admin

路线基本上应该是

Route::get('admin', function()
{

    return View::make('admin.index');

 })->before('auth');

我不知道如何/在哪里/应该首先检查管理员角色,然后如何将其应用于身份验证检查,以仅允许管理员访问路由。

谢谢你的帮助。

共有2个答案

章永安
2023-03-14

对于Laravel 5,使用中间件:

创建新的中间件

# php artisan make:middleware RoleMiddleware

检查用户角色-如果角色无效则重定向

// app/Http/Middleware/RoleMiddleware.php

class RoleMiddleware
{
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // Redirect...
        }

        return $next($request);
    }
}

添加密钥以分配给路由-也可以使其成为全局

// app/Http/Kernel.php

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'role' => \App\Http\Middleware\RoleMiddleware::class, // new
];

保护路线

// app/Http/routes.php

Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
    // routes for editor
}]);
孔和畅
2023-03-14

您已经使用了auth过滤器,因此您应该在app/filters中签入auth过滤器。php文件:

Route::filter('auth', function($route, $request)
{
    // Login check (Default)
    if (Auth::guest()) return Redirect::guest('login');

    // Admin check
    if(!in_array('admin', Auth::user()->roles->toArray())) {
        return Redirect::to('/'); // Redirect home page
    }

});

您可以使用不同的过滤器,例如:

Route::get('admin', function()
{
    return View::make('admin.index');

})->before('isAdmin');

app/filters中声明自定义isAdmin过滤器。php

Route::filter('isAdmin', function($route, $request)
{
    if(!Auth::check()) return Redirect::guest('login');
    if( !in_array('admin', Auth::user()->roles->toArray()) ) {
        return Redirect::to('/'); // Redirect home page
    }

});
 类似资料:
  • 我已经开始了一个现有的Laravel 5.2项目的工作。我需要为应用程序的前端构建一些基本的应用程序接口请求来与数据库交谈。这些路由需要由用户的会话进行身份验证。 我已经尝试使用auth:api驱动程序设置中间件,并且在/config/auth。php将api['driver']设置为'session'。但是,我一直将302重定向到登录页面,即使用户已通过所有权限和角色的身份验证。 有人能推荐一些

  • 我与拉雷维尔和托拉斯合作,基础工作很好。我确实有一个问题似乎不是随包而来的。我想要的是,当我执行时,如果他们登录,它也会返回他们的角色。目前我知道我可以做

  • 我的Java应用程序中有多个用户角色。下面是我的代码: 错误: 因此,所发生的情况是,它加载了用户数据的URL访问权限,但当执行最后一行时,它将/dashboard URL更改为具有ADMIN访问权限。我的角色仍然是数据角色,因此不能访问/dashboard URL。 最后一行似乎覆盖了其他行。再来看看URL特权,如果我删除“/dashboard”,那么当涉及到“/data”URL时,我会得到同样

  • 我是拉威尔5号的新手,我只是想知道如何保护特定路线?我正在使用默认的身份验证中间件来保护我的路由,这只有在您登录时才可访问。所以我有这个。 如何仅保护/auth/register?不影响其他人的登录吗? 默认情况下,在我的路由组之外,我有此选项。 我只希望登录的用户访问默认的注册页面。我的登录用户都是管理员。

  • 我在学Spring保安。 在浏览了一些教程之后,我发现其中一些使用了UserRole,而一些使用了一个实现身份验证的UserAuthentication类。我尝试实现的一个(并起作用)是创建一个自定义的MyUserDetailsService,它实现UserDetailsService,并授予权限(角色?)像这样: 我想知道用户角色和GrantedAuthorities之间有什么区别(例如,当使用

  • 我已经基于命名的路由为Laravel(4.2)创建了自定义角色管理器,例如: 基本上,任何注册为