之前接手了一個(gè)項(xiàng)目毅厚,用了很多很多的gem包,可以說到了泛濫的地步浦箱,當(dāng)然這其中也包含cancancan了吸耿,只是用了其中的皮毛而已。到了現(xiàn)在酷窥,要做用戶權(quán)限管理咽安,當(dāng)然了,已經(jīng)用了cancancan了蓬推,就在這上面繼續(xù)開發(fā)了妆棒,這才是痛苦的開始 。
再做權(quán)限開發(fā)之前,還沒有發(fā)現(xiàn)這么多問題:
1糕珊、這個(gè)項(xiàng)目根本不是restful設(shè)計(jì)动分。
2、model和controller不是一一對(duì)應(yīng)的红选。
這兩個(gè)問題直接導(dǎo)致了cancancan不能直接用澜公,需要添加一些無(wú)用model。
我是如何用cancancan做權(quán)限管理的呢喇肋?
總體思路:我把用戶和角色分開管理坟乾,都是一些基礎(chǔ)的增刪改之類的,再建立一個(gè)關(guān)系表存放用戶和角色的關(guān)系(多對(duì)多的關(guān)系)蝶防。把權(quán)限管理放在角色里甚侣,每個(gè)角色單獨(dú)設(shè)置權(quán)限,這里我是這么做的慧脱,建立權(quán)限表渺绒,把所有的權(quán)限都寫入這個(gè)表中,然后再建立權(quán)限和角色的關(guān)系表(也是多對(duì)多的關(guān)系)菱鸥,在角色里設(shè)置權(quán)限的時(shí)候把它們之間的關(guān)系保存在這個(gè)表里宗兼。
頁(yè)面上怎么做就更加的靈活了,我是把用戶和角色各用一個(gè)頁(yè)面展示氮采,做各自的增刪改殷绍,只是在添加或修改用戶的時(shí)候,可以選擇多個(gè)權(quán)限鹊漠。在角色的頁(yè)面里主到,為每個(gè)角色增加一個(gè)設(shè)置權(quán)限的按鈕,點(diǎn)擊進(jìn)去之后的頁(yè)面,把所有的權(quán)限表里的權(quán)限都用checkbox列出來(lái)躯概,可以選擇并保存登钥。
置于cancancan的用法,我是設(shè)置在ability里的娶靡,具體的用法參考:https://github.com/CanCanCommunity/cancancan牧牢。
這里不能不提load_and_authorize_resource,它加載資源姿锭,并且驗(yàn)證權(quán)限塔鳍,有一句話介紹了它: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.