【发布时间】:2015-09-29 05:37:48
【问题描述】:
我已经成功推出了自己的基于角色和权限的授权系统:
- 角色和权限都是数据库中的模型,它们通过另一个表具有多对多关系。
- 用户属于_一个角色并通过该角色拥有_许多权限
- 管理员用户可以创建新角色并定义哪些权限与哪些角色对应。
- 控制器和视图会在执行或呈现某些内容之前检查当前用户是否具有特定权限。
这一切都非常好。这是包含在application_controller,rb 中的代码的关键部分:
def permitted_action (permission_names)
# if the users permissions do not instersect with those given then redirect to root
redirect_to(root_url) if (permission_names & current_user.permissions.map(&:name)).empty?
end
这是一个验证用户权限的控制器:
before_action only: [:new, :create] do
permitted_action ['create_user']
end
我的问题是权限是具有唯一字符串名称的数据库行,当我想识别权限时我会使用这些名称。因此,我使用我需要的所有权限为数据库播种,然后当视图或控制器需要检查权限时,我需要在此时获取权限名称。如果我检查权限“add_user”,但在数据库中权限名称是“add_users”,就会出错。
然后在测试中,我必须再次将所有权限作为固定装置放入,并重新获得所有名称。
当我添加需要更多权限的功能时,我必须在至少 3 个不同的地方使用相同的字符串添加这些权限。这对我来说似乎是错误的。
理想情况下,控制器会定义他们使用的权限,db/seeds.rb 文件会获取这些权限并为 db 提供种子,测试装置也会获取它们,但我不确定是否这是可能的。
我应该如何构建它?
编辑:
我认为对我有帮助的是提供 db/seeds.rb 文件的夹具解析器。从permissions.yml 获取类似的东西:
archive_tally:
name: archive_tally
description: Archive or make active any tally
category: 3
然后吐出这样的东西:
archive_tally = Permission.find_or_initiate_by_name("archive_tally")
archive_tally.description = "Archive or make active any tally"
archive_tally.category = 3
archive_tally.save!
我认为这种东西还不存在。
【问题讨论】:
-
我认为我需要做的是在控制器中使用特殊格式的 cmets 来声明它们正在使用的权限,然后有一个 rake 任务来扫描控制器中的这些声明,然后填充 db/seed.rb具有尚不存在的权限。另一个 rake 任务将执行相同的操作来填充测试夹具。但是,由于我不知道编辑 rake 文件的第一件事,也没有时间学习,所以我只需要手动放入种子和固定装置就可以了。
-
我刚刚注意到this question 的公认答案应该让我大有帮助。
标签: ruby-on-rails ruby-on-rails-4 permissions authorization