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,因为它们为您提供了所有这些开箱即用的功能。
另一方面,如果您这样做是为了学习,那就继续吧!
我一直在修改我自己的用户授权,并根据我的 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,因为它们为您提供了所有这些开箱即用的功能。
另一方面,如果您这样做是为了学习,那就继续吧!