Rails 关于用户权限的问题

solopiggy · 2015年03月19日 · 最后由 brenda103 回复于 2015年08月24日 · 3401 次阅读

rails 新手,准备做一个校园旧书交易系统。暂时简单学了 rails 的 CRUD 操作和用户的注册和登录功能,目前的困难是实现一个用户的权限问题:用户只能对自己上架的旧书进行更改很删除操作。希望得到指导,非常感谢您的任何建议。。(^__^) ……

自己上架的书应该有外键用户 id 的,查询过滤一下就可以了吧。

用这个 gem https://github.com/elabs/pundit

@book = Book.find(params[:id])
authorize @book, :update?
@book = current_user.books.find params[:id]

3 楼正解,眼光放远一点,推荐你看一下cancancan这个 gem。 具体的示例代码就看 Ruby-China 的源代码吧,写的真心赞。

#2 楼 @foxzool 想问一下,什么场景下用 pundit? 我最近限制阅读权限,感觉比较简单,就是自己写的

#5 楼 @cqcn1991 这个看你应用的复杂程度吧,例如你的应用只有一两种用户角色的情况下,用 #3 楼 的方法就可以了。如果你用户角色种类非常多的情况下,甚至还有一些其它的附件条件,那可以考虑 #2 楼 或者 #4 楼 的建议。

#5 楼 @cqcn1991 看一下pundit的 README,在不使用scope的情况下,就是一个很纯粹的 class,逻辑很很简单。

class PostPolicy
  attr_reader :user, :post

  def initialize(user, post)
    @user = user
    @post = post
  end

  def update?
    user.admin? or not post.published?
  end
end

可以直接通过 PostPolicy.new(current_user, @post).update?来做权限判断。 pundit就是在上面的逻辑上再包装了一层 controller\view 的 helper 方法。

@solopiggy 如果你有一天时间,建议使用 cancancan,自此以后不会被权限问题困扰,项目不论大小,不论复杂程度,最多一小时可以设定好。

cancan 不维护了,现在是社区版 cancancan

基础:当然可以看 github 官方帮助,但 xdite 讲得相当好: http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-1/ http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-2/ http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-3/

把权限定义放在数据库,这样以后要添加权限,不用改代码,直接在数据库就可以搞定: https://ruby-china.org/topics/5938

这是我做的项目,按 Readme 可以在 heroku 跑起来,你就知道在管理后台设定用户权限是多么简单方便的一件事: https://github.com/ZPVIP/church/

权限定义文件: https://github.com/ZPVIP/church/blob/master/app/models/ability.rb

View: if can? :read, Contact 之类的: https://github.com/ZPVIP/church/blob/master/app/views/layouts/application.html.erb

Model: https://github.com/ZPVIP/church/blob/master/app/models/user.rb https://github.com/ZPVIP/church/blob/master/app/models/permission.rb https://github.com/ZPVIP/church/blob/master/app/models/user_permission.rb

普通权限当然很简单,比如登录后才能查看,用户只能更改自己发的帖子之类的,下面是在管理后台自定义权限的页面:

在用户编辑页面,可以给某个用户设定权限:

#11 楼 @peter 非常感谢你的回答,简直太棒了。。

#11 楼 @peter 正在用你回复的这种方式给用户加权限,可是在 user 的 form 中用到<%= f.assciation :permissions, :as => 'check_boxes' %>时报错 undefinded method 'assciation' for #SimpleForm::FormBuilder:0xbcf548dc这是为什么呢?

#13 楼 @brenda103 我用的 simple_form gem,assciation 是在 simple_form 定义的,你有没有用这个?

#14 楼 @peter 用了 gem 'simple_form', '~> 3.0.3' gem install simple_form -v 3.0.3 rails generate simple_form:install 还是报这个错误

#15 楼 @brenda103 亲,你的 assciation 拼错了,建议用 rubymine 吧,可以完全避免这类低级错误

需要 登录 后方可回复, 如果你还没有账号请 注册新账号