之前接手了一个项目,用了很多很多的gem包,可以说到了泛滥的地步,当然这其中也包含cancancan了,只是用了其中的皮毛而已。到了现在,要做用户权限管理,当然了,已经用了cancancan了,就在这上面继续开发了,这才是痛苦的开始 。
再做权限开发之前,还没有发现这么多问题:
1、这个项目根本不是restful设计。
2、model和controller不是一一对应的。
这两个问题直接导致了cancancan不能直接用,需要添加一些无用model。
我是如何用cancancan做权限管理的呢?
总体思路:我把用户和角色分开管理,都是一些基础的增删改之类的,再建立一个关系表存放用户和角色的关系(多对多的关系)。把权限管理放在角色里,每个角色单独设置权限,这里我是这么做的,建立权限表,把所有的权限都写入这个表中,然后再建立权限和角色的关系表(也是多对多的关系),在角色里设置权限的时候把它们之间的关系保存在这个表里。
页面上怎么做就更加的灵活了,我是把用户和角色各用一个页面展示,做各自的增删改,只是在添加或修改用户的时候,可以选择多个权限。在角色的页面里,为每个角色增加一个设置权限的按钮,点击进去之后的页面,把所有的权限表里的权限都用checkbox列出来,可以选择并保存。
置于cancancan的用法,我是设置在ability里的,具体的用法参考:https://github.com/CanCanCommunity/cancancan。
这里不能不提load_and_authorize_resource,它加载资源,并且验证权限,有一句话介绍了它:theload_and_authorize_resourcemethod is provided to automatically authorize all actions in a RESTful style resource controller. It will use a before action to load the resource into an instance variable and authorize it for every action.