Laravel 4.2 用户角色安全

Laravel 4.2 User Role Security

我一直在修改我自己的用户授权,并根据我的 users 的数据库条目提供用户角色。

我做了两个角色;一个 user 角色,它只是一个普通的注册用户,还有一个 author 角色,这显然是一个作者。

在我的用户 table 迁移中,我使用 $table->string('role')->default('user'); 作为默认用户角色。然后我可以从某个地方的表格中决定用户是否应该是作者。

在我的 User.php 中,我设置了一个 public function 来调用我的用户 table 中的角色数据库条目,如下所示:

public function isAuthor()
{
    if (Auth::guest()) return false;
    return Auth::user()->role = $this->role == 'author';
}

我现在可以在我的模板中调用它,如下所示:

@if($user->isAuthor())
    <p>Only the author can this!</p>
@endif

这给了我期望的控制力,但我并不完全相信“就这么简单”这一事实。我知道是的,我可以创建与用户的关系并绑定两个模型之间的关系,但我发现这非常简洁。我唯一担心的是安全问题。

从长远来看,这可能不是最佳做法,但我对 Laravel 还很陌生,想知道与其他可用方法相比,按照我的方式进行操作有什么安全隐患。

我完全理解 SO/Laravel 文档和用户角色上还有其他方法一直是许多讨论的主题,但是,我从来没有按照我实现它的方式看到它(这让我担心).我只是注意到我可以使用上述方法检查当前用户是否已登录,并认为查询数据库以查找匹配的字符串的工作方式相同——而且确实如此。

我的问题是,在现实世界中使用它是否足够安全?

看起来您只是在数据库中使用了一个 varchar 字段,并围绕它硬编码了您的权限。我提出一个更好的结构。

table: users
columns: id:int, role_id:int username:varchar64 password:varchar64 etc

table: roles
columns id:int, name:varchar64, description:varchar64 etc etc...

table: permissions
columns: id:int, name:varchar64

table:roles_permissions
columns: role_id:int, permission_id:int

这里我们有四个 table,一个用于用户、用户角色、权限,一个连接枢轴 table 用于角色和权限之间的多对多关系。 这是任何 RBPS(基于角色的权限系统)的基础。

每个user可以有一个role

一个role可以有0很多permissions

通过这个概念,我们可以一遍又一遍地重用角色,甚至可以通过额外的加入让一个用户拥有许多角色 table 是适用的。

所有权限将像这样存储: id:1, name:can_login

如果 can_login 关系存在于 user 的角色存在,他可以登录。一些模拟代码。

if(Auth::can('can_login'))
{
    //Log me in etc etc
}

使用数据库的好处是我们不会重复自己权限逻辑,这是它本身的设计原则。

此类功能已多次提供,我建议您查看 Entrust 和 Confide for Laravel,因为它们为您提供了所有这些开箱即用的功能。

另一方面,如果您这样做是为了学习,那就继续吧!