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

xdite · 2012年08月03日 · 最后由 Magic 回复于 2012年08月10日 · 6562 次阅读
本帖已被设为精华帖!

這是最近寫的三篇有關 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/

共收到 14 条回复

下午就拜读了,楼主很强啊,对了,一直不知道楼主是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 了解,我也没好好看文档 (>_<)

很强!学习了~

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