2013年12月12日 星期四

[ROR] 後台建立 - 權限建立

這裡使用了 cancan這個有名的library

目標

1. 用 Device註冊帳號的初始帳號都是一般權限

2. 有一個網頁可以修改某個user為 admin的權限

3. 每個user都可以看某個頁面,但是因為權限不同而會不同






但是正如同

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/

這三篇講的  官方的文件真的看不懂  (其實是我英文不好 Orz)



  1. 加入cancan

    # 使用者權限
    gem "cancan"

    執行 bundle install
  2. 關掉上次工作內容 中的 admin::lists

    把routes.rb中的項目關閉
  3. 加入新的vc

    rails g controller admin::users
  4. 在 controllers/admin/users_controller.rb 裡加入
  5. class Admin::UsersController < ApplicationController
    
        before_filter :authenticate
    
        def index
            @users = User.all
        end
    
        def update
            @user = User.find(params[:id])
            #user_admin_params
            if (params[:user][:admin].eql?("1") )
                @user.admin = true
            else
                @user.admin = false
            end
            @user.save
    
            redirect_to :action => :index
        end
    
        protected
    
        def authenticate
            authenticate_or_request_with_http_basic do |user_name, password|
                user_nameMD5 = Digest::MD5.hexdigest(user_name)
                passwordMD5 = Digest::MD5.hexdigest(password)
                user_nameMD5 == "????????????????" && passwordMD5 == "??????????????"
            end
        end
      
        def user_admin_params
            params.require(:user).permit(:user)
        end
    
    end
    

    主要目的是做一個簡單的認證,然後可以顯示現在的使用者列表,且可以更新 admin的狀態

    在views/admin/users/index.html.erb 裡則寫


    <% @users.each do |user| %>
     
      <%= user.email %>
      <%= user.admin %>
      <%= form_for user, :url => admin_user_path(user), :method => :put do |f| %>
        <%= f.label :admin %>
        <%= f.check_box :admin %>
        <%= f.submit "update" %>
        <% end %>  
    
    <% end %>
    

    那這樣就可以靠簡單的basic 認證,登入修改使用者的admin的屬性

  6. 加入list 要顯示的 controller and model

    rails g controller lists

    rails g model list title:string objectId:string

    註:因為其實我們的後台只是要控制parse (用javascript 控制),在現階段的目標其實不用model才是。

    但是cancan需要 controller 對應到同樣名稱的model ,

    如果需要產生model 需要在controller 中權限限制的話

    要在 controllers/list_controller.rb 加入

    load_and_authorize_resource
  7. 在 view/list/index.html.erb中加入
    <%= content_for :head do %>
      
    <% end %>
    
    <%= render :partial => "login" %>
    
    <% if can? :create, @list %>
      <%= render :partial => "lists_add_form" %>
    <% end %>
    
    
    
    if can? :create, @list  就是拿來限制(條件)view顯至的狀況


  8. 顯示的規則寫在 models/ability.rb

    先使用

    rails g cancan:ability

    建立該檔案

    然後再加入
        if user.blank?
    
            # not logged in
    
            cannot :manage, :all
    
        elsif user.admin
    
            # admin
    
            can :manage, :all
    
        else
    
            cannot :manage, :all
    
        end
    
    

    主要就是拿來限制user的各種狀況,對各個api 的使用權

    而上一個在view的if can? 就是拿這個表去確認


沒有留言:

張貼留言