日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Ruby on Rails: 使用devise+cancan+rolify建立完整的权限管理系

發(fā)布時(shí)間:2025/3/19 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ruby on Rails: 使用devise+cancan+rolify建立完整的权限管理系 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

devise、cancan和rolify這三個(gè)組件結(jié)合,可以建立完整而強(qiáng)大的用戶權(quán)限模型。

  • devise介紹,負(fù)責(zé)用戶注冊(cè)、登錄、退出、找回密碼等操作。細(xì)節(jié)參考devise on github
  • cancan介紹, 負(fù)責(zé)角色建立、對(duì)角色授權(quán)、在頁(yè)面中根據(jù)授權(quán)是否顯示元素,以及模型中超出授權(quán)時(shí)拋出異常。細(xì)節(jié)參考rolify on github
  • rolify介紹,負(fù)責(zé)將用戶與角色關(guān)聯(lián)。細(xì)節(jié)參考rolify on github

下面就簡(jiǎn)單介紹下這三者結(jié)合使用的方法,比較淺,深層次的大家自己去看文檔挖掘,這里僅僅介紹最基本的使用。

運(yùn)行環(huán)境

這里我用的是ruby 1.9.3-p484 ? ? ? rails ? 3.2.16

新建一個(gè)項(xiàng)目

rails new demo --skip-bundle ? #跳過(guò)bundle

在Gemfile里面添加如下Gem包

?
1 2 3 4 # add a perfect user verify system gem 'devise' gem 'cancan' gem 'rolify'

然后運(yùn)行bundle install

?執(zhí)行devise初始化

$ rails generate devise:install

這句命令會(huì)產(chǎn)生一個(gè)用戶指南,告訴你該做的幾件事請(qǐng),以下是內(nèi)容翻譯(已經(jīng)去除heroku部署的那一條,增加了登錄退出選項(xiàng)的說(shuō)明):

1) 確定你的環(huán)境中有一個(gè)缺省的URL,config/environments/development.rb:

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

如果在production環(huán)境, :host 必須設(shè)置成應(yīng)用的真實(shí)主機(jī)名。

2) 確定已經(jīng)在config/routes.rb中定義了root_url(注意刪除public下面的index.html), 例如:

root :to => "home#index"

可以使用下面命令生成一個(gè)home#index的頁(yè)面:

rails g controller home index

3) 在app/views/layouts/application.html.erb中增加消息提醒,例如:

<p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p>

4) 很多時(shí)候還需要增加登錄、退出的選項(xiàng):

?
1 2 3 4 5 6 7 ????<% if current_user %> ??????<%= link_to('退出', destroy_user_session_path, :method => :delete) %> | ??????<%= link_to('修改密碼', edit_registration_path(:user)) %> ????<% else %> ??????<%= link_to('注冊(cè)', new_registration_path(:user)) %> | ??????<%= link_to('登錄', new_session_path(:user)) %> ????<% end %><span></span>

5) 如果要定制Devise的view模型,可以再執(zhí)行以下語(yǔ)句:

$ rails g devise:views

生成用戶模型(你可以使用其他名稱代替User),并執(zhí)行數(shù)據(jù)遷移

$ rails g devise User $ rake db:migrate

?在Controller中增加認(rèn)證過(guò)濾,即可在訪問(wèn)該模型頁(yè)面時(shí)轉(zhuǎn)向用戶登錄頁(yè)面(這自行沒(méi)驗(yàn)證)

在需要認(rèn)證的模型中,如HomeController,增加下面代碼:

before_filter :authenticate_user!

集成cancan和rolify

cancan提供對(duì)資源的授權(quán)控制。例如,在視圖中使用can?方法來(lái)決定是否顯示某個(gè)頁(yè)面元素。如果系統(tǒng)角色非常簡(jiǎn)單,那么cancan還在代碼中直接指定常量就可以支持,具體操作可以參考官方文檔。但要提供復(fù)雜的角色管理,最好的方案,還是在devise基礎(chǔ)上再集成cancan+rolify。

1. 修改Gemfile,并再次運(yùn)行bundle install

gem 'cancan' gem 'rolify'

2. 創(chuàng)建cancan的Ability和rolify的Role

$ rails generate cancan:ability $ rails generate rolify Role User $ rake db:migrate

3. 定制devise用戶注冊(cè)事件,可以在注冊(cè)時(shí)賦予用戶rolify角色,例如,下面的代碼為首個(gè)用戶賦予admin角色:

?
1 2 3 4 5 6 7 8 9 10 11 class ApplicationController < ActionController::Base ?????def after_sign_in_path_for(resource) ???????if resource.is_a?(User) ?????????if User.count == 1 ???????????resource.add_role 'admin' ?????????end ?????????resource ???????end ???????root_path ?????end ???end

4. 使用cancan可以為rolify中建立的角色分配授權(quán)資源,例如我們?yōu)樵试Sadmin角色的用戶分配針對(duì)所有控制類的”manage”資源,而其他用戶分配”read”資源:

?
1 2 3 4 5 6 7 8 9 10 class Ability ?????include CanCan::Ability ?????def initialize(user) ???????if user.has_role? :admin ?????????can :manage, :all ???????else ?????????can :read, :all ???????end ?????end ???end

5. 以上已經(jīng)實(shí)現(xiàn)了“用戶-角色-權(quán)限”的三層權(quán)限模型,在view中就可以使用了。例如,在Home#index頁(yè)面中增加如下代碼:

?
1 2 3 4 5 6 <% if user_signed_in? %> ????????<p>The user is loged in.</p> ????????<% if can? :manage, :Home %> ??????????<%= link_to "About", home_about_path?? %> ????????<% end %> ????<% end %>

(完)

總結(jié)

以上是生活随笔為你收集整理的Ruby on Rails: 使用devise+cancan+rolify建立完整的权限管理系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。