授权 - 如何在Web应用中检查用户权限?

时间:2013-12-30 09:11:15

标签: mysql web-applications authorization

我有一个简单直接的授权实现。好吧,我只想我做,我想确保这是正确的方法。

在我的数据库中,我有以下表格:usersrolesuser_rolepermissionsrole_permissionuser_permission

当我创建用户时,我当然是在给他一个角色,而且这个角色已经有了一些权限。我想明确检查不是这个角色的权限,但是我很好奇我是否应该只从role_permission表检查这些权限,或者检查user_permission,我认为这很多更灵活,因为用户可以从role_permission表中默认授予一些权限,然后可以由管理员稍后添加,删除权限。

我认为第二种方法更好,我想问我是否正确,这是应该做的吗?我不确定将user_permission表的内容复制到user_permissions表中。也许我应该采取另一种方式,我认为这一步很奇怪。

请帮忙

3 个答案:

答案 0 :(得分:2)

老实说,您正在重新发明轮子,因此您应该查看现有的解决方案,以便在您使用的任何技术中执行此操作。获得正确的安全是很困难的,因此在可能的情况下,您应该利用该领域的专家提供的内容。

我个人说过,我不会允许个人权限与群组权限分开。如果你这样做并拥有多个用户,那就成了行政噩梦。想象一下,在软件的一部分中发现了一个严重的错误,并且没有人使用它是必要的。你进去并从所有角色中删除了这个权限......工作做得对吗?但不,有人被单独授予角色,仍然可以访问它。您还需要维护所有额外的代码和复杂性以允许单独的角色。

这只是一个例子,但希望它能说明你开始允许的一些复杂情况。

通过为每个用户设置多个角色,您无法通过定义和使用适当的角色来执行个人权限。

顺便提一下,如果要缓存用户权限,请记住在用户角色更改和角色权限更改时都需要更新缓存。

答案 1 :(得分:0)

每个Linux / Unix都支持个人权限和群组权限。 所以这是一个很好的支持功能,大多数用户实际上都希望它默认可用。

否则@Tim B是对的 - 不需要重新发明轮子。现在每个框架都有支持权限和角色的用户模块/扩展。

如果由于某种原因你想自己实现它,那么步骤应该如下:

  1. 获取用户个人权限列表
  2. 获取角色授予的用户权限列表
  3. 添加(连接)两个集合并将结果用作当前用户权限列表
  4. 如果有缓存,那么当然角色或个人权限的每次更改都应该使用户已经缓存的权限无效。

答案 2 :(得分:0)

我同意Antoan Milkov和Tim B:不需要重新发明轮子。

根据您使用的框架,有很多可行的解决方案。以下是一些:

  • Java:使用Spring Security(它不是唯一的选择)
  • .NET:使用Microsoft基于声明的身份验证和授权
  • Ruby:使用CanCan
  • Python:使用Flask-Auth
  • 以及更多...

如果您想进一步了解授权背后的理论(以及更广泛的访问控制),请阅读基于角色的访问控制和基于属性的访问控制,这些都在NIST中有详细记录:

最后,如果您需要基于标准的方法,请考虑XACML,即实施ABAC的可扩展访问控制标记语言,并为您提供基于策略的授权方法。

查看维基百科和YouTube以获取更多信息。