我现在正在学习Ruby on Rails,在学习过程中我正在写一个简单的博客。我遇到了一个问题 - 我需要有两个会话 - 管理员会话,其中管理员可以创建,更新和删除帖子并创建/更新评论,以及用户会话,其中用户只能创建,更新和删除他自己的评论,以便每个帖子都属于管理员并显示他的名字,每个评论都应该属于某个用户并显示他自己的名字(作为登录/登记的方法我想要一个简单的表格,名称,电子邮件和密码或通过Facebook / VK API)
答案 0 :(得分:1)
这里的关键是理解授权和身份验证之间的区别。
身份验证能够验证用户的身份。这就是Devise解决的问题。这涉及记录用户进出,并跟踪当前用户是谁。
授权是谁在应用程序中执行的操作。 "用户只能创建,更新和删除他自己的评论"是明确的授权规则示例。
大多数初学者出于某种无法解释的原因,将授权干扰到身份验证层。因此,他们开始尝试验证Admin类和Visitor类,并且身份验证层最终像瑞士奶酪一样。为了解决第一个问题,他们添加了单表继承或MTI,这只会加剧问题。
相反,如果您将授权视为一个链接但独立的问题,则可以使用更简单且经过尝试的解决方案:角色。
最简单的解决方案是使用位掩码(整数列)和ActiveRecord::Enum来表示用户角色:
class AddRoleToUsers < ActiveRecord::Migration
def change
add_column :users, :role, :integer, default: 0
add_index :users, :role
end
end
class User < ActiveRecord::Base
enum role: [:user, :admin]
end
这会让你做@user.admin?
之类的事情。只要您有一个非常简单的场景,即角色是应用程序范围的,并且用户只能拥有一个角色,这就可以工作。对于更复杂的场景,您通常会设置Role
模型(双关语),并在用户和角色之间创建一对多或多对多关系。有关其工作原理的示例,请参阅Rolify gem。
您可能希望查看一些现有的授权和身份验证解决方案,并在尝试重新发明轮子之前弄清楚如何集成它们。