我一直在修改自己的用户授权,并根据users
的数据库条目提供用户角色。
user
角色,只是一般的注册用户和author
角色,显然是作者。
在我的用户表迁移中,我使用$table->string('role')->default('user');
作为默认用户角色。然后,我可以从某个表单决定用户是否应该是作者。
在我的User.php
中,我设置了一个public function
来调用我的users表中的角色数据库条目,如下所示:
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 Docs上有其他方法,用户角色已成为许多讨论的主题,但我从未见过它实现它的方式(这让我很担心)。我只是注意到我可以使用上面的方法检查当前用户是否已登录并认为查询数据库中匹配的字符串将起作用 - 而且确实如此。
我的问题是,这在现实世界中使用是否足够安全?
答案 0 :(得分:2)
您似乎只是在数据库中使用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
这里我们有四个表,一个用于用户,一个用户角色,权限和一个连接数据透视表,用于角色和权限之间的多对多关系。 这是任何RBPS(基于角色的权限系统)的基础。
每个user
可以有一个 role
role
可以 0 或很多 permissions
通过这个概念,我们可以反复重复使用角色,甚至可以让用户拥有许多角色,并且可以使用额外的连接表。
所有权限都将如下存储:
id:1, name:can_login
如果can_login
角色存在user
关系,则可以登录。一些模拟代码。
if(Auth::can('can_login'))
{
//Log me in etc etc
}
使用数据库的好处在于,我们不要重复自己使用权限逻辑,这是其自身的设计原则。
此类功能已反复提供,我建议您查看Latrvel的Entrust和Confide,因为它们为您提供了所有这些功能。
另一方面,如果你要这样做,那就继续学习吧!