Gem Cancan 實作角色權限設計的最佳實踐

xdite · 2012年08月03日 · 最后由 Magic 回复于 2012年08月10日 · 8041 次阅读
本帖已被管理员设置为精华贴

這是最近寫的三篇有關 Cancan 的文章。

原因是 cancan 的文件寫的實在太爛,有 example 還是一知半解,於是我花了一點時間把那些模糊的地方抓出來解釋了一番 :P

希望對大家開發時有幫助

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/

下午就拜读了,楼主很强啊,对了,一直不知道楼主是 GG 还是 mm

刚去看了一次,lz 是个有心人

台湾的?拜读下

@winnie xdite,台湾的顶级 Ruby 高手之一~

拜读了,楼主是有心人

楼主能否再扩展的写一下 在用 cancan 之前的配置? 比如 roles 这些?

我是参照别的地方来添加 roles 的,然后套用你的代码,但是一直有问题, 现在是 user1 身份可以管理任何 action,但是其他身份的 user 没有权限,包括他自己先前发布的文章都不可以操作了。

我这里有一个 CANCAN 的问题,不知道谁能帮我解决一下。就是当我使用了 namespace 的时候

resources :products     #1
namesapce :admin do  #2
  resources :products
end

如果我希望 namespace 下的 products 只可以让 admin 管理的话,如果直接对 Product 进行会同事对 namespace 和非 namespace 的 Prodcut 进行了操作。例如我希望#1 的可以让所有的人浏览只需要:

can :read, :all

同时#2 处的也会变成所有人都可以浏览。请问这个时候的 cancan 怎么设计比较好呢?

一直有关注你的 blog,质量非常的高。谢谢分享。

@JeskTop 不知道这样可不可以:

假设你的 user 有 is_admin?方法,在你的 ability.rb 里:

For Normal User

can :read, Product

For Admin User

if user.is_admin? can :manage, Product end

在你的 ProductController 里只要加上 load_and_authorize_resource 应该就可以实现你的要求了吧

#11 楼 @leomao10 这样子不可以,当你非 admin 用户访问 namespace 里面的 product 的时候,依然可以访问 index 和 show 页面的。 https://github.com/ryanb/cancan/wiki/Admin-Namespace 我认真看了一下 wiki 发现有写,创建另外一个 Ability 就可以很好的处理这个问题了。

@JeskTop 了解,我也没好好看文档 (>_<)

很强!学习了~

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