Rails的用户访问插件
-
20-08-2019 - |
题
有很多轨道插件在那里,处理用户的权限。我印象深刻的流浪汉宝石的执行,但我不知道我是否可以只使用此功能,而不是其他部位。网守是一个非常聪明的实现,但是有一些错误,虽然它足够小,我可能要自己解决。 Restful_ACL给你检查创建,这意味着你不能做实例任何检查有问题(不知道,如果它不作用域的发现)一类的方法。
我想的东西,提供的ActiveRecord#查找的范围的版本,只能找到当前事物的用户可以去看看。这应该是足够强大的话,你只能看到那些在您所拥有或您的朋友一个画廊的图片。
作为奖励,它可以防止产生或你没有执行权,包括自己的记录,用不同的用户或画廊关联,或创造这样的记录更新(在before_ *或验证步骤)。
解决方案 4
在回想起来,我将只使用流浪汉图案。它是最简单和最灵活的。
其他提示
可以做与 declarative_authorization 插件模型级别一些非常复杂的授权技巧。不过,我自己比较喜欢轨授权 - 插件 - 这一个您定义的模型级的角色(例如,某人是一个资源的所有者),并在控制器级别的权限(例如,仅一个资源或管理员的所有者可以得到的资源)。我发现这种方法更加简洁,特别是如果你正在追求一个干净的REST方式。如果有这样一个要求:
GET /posts
你真的应该返回是的所有帖子的,而不仅仅是当前用户的帖子。 为了这个目的,你应该有不同的路线:
GET /users/:user_id/posts
其中:USER_ID被设置为当前用户的ID。 这种差异应该然后在适当的动作进行镜像:
def index
user = User.find(params[:user_id]) unless params[:user_id].blank?
@posts =
if user
# get all posts of a user
user.posts.all
else
# get all posts
Post.all
end
end
现在,你真的有这里有两个授权语境 - “获取用户的所有帖子”和“让所有的帖子”和你平时想为这两个设置不同的权限(例如:“只有管理员可以得到所有的职位”。和“仅用户它自或管理员可以得到一个用户的所有文章”)。
我有一个宝石这是完全对能够基于他们的角色对象指定的权限。你可以在这里看看: http://github.com/nakajima/roleful/tree/master 。这将很好的工作排序before_filter
办法你暗示。
至于只允许用户访问与他们有某种关系的事情,我认为你正在寻找一个总理候选人的Rails协会代理。我喜欢米兰Novota的片段,但我会修改它稍微:
def index
@posts = user_repo.posts
end
private
def user_repo
# find_by_id is **much** faster than regular find,
# plus it just returns nil when there's no record
if user = User.find_by_id(params[:user_id])
# returns the association proxy
user.posts
else
# returns the class
User
end
end
您可以检查出锁定。我还没有实施的项目还没有这样,但它可以为您节省一些工作。