칸칸칸으로 해볼게요.

다음은 "데비스 테스트"입니다.
사용자가 쉽게 권한을 부여할 수 있는 CanCanCan을 가져왔습니다.
공식 Giithub→https://github.com/CanCanCommunity/cancancan#readme

Gemfile 업데이트


Gemfile
+ gem 'cancancan'
bundle install
참고로 bundle install과 업데이트의 차이는 아직 잘 모르겠어요. 간단하게 말씀드리겠습니다.
  • install: Gemfile.Gem을 설치하려면 lock을 참조하십시오.
  • update: Gemfile.설치할 때 lock를 참고하지 않습니다.
  • 상세한 해설은 아래 글에 기재되어 있는데 기본적으로 사용하는 것이 좋다bundle install.
    ( bundle install과 bundle update의 차이점 )

    루트 막대 추가

    devise에서 기본적으로 만들어진 표를 사용하고 관리 권한role의 열을 추가합니다.
    마이그레이션 파일을 만들기 위해 열을 추가합니다.
    rails g migration add_role_to_admin_users role:integer
    
    그리고 생성된 이전 파일을 다음과 같이 수정합니다rails db:migrate.
    class AddRoleToAdminUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :admin_users, :role, :integer, null: false, default: 2
      end
    end
    
    권한 열은 INT 유형으로 데이터를 저장합니다.
    2의 정의는 잠시 후에 실시된다.
    SQLite, PostgreSQL에서는 지정된 위치에 열을 추가할 수 없습니다.
  • SQLite3로 열 추가하기
  • postgresq에서ddcolumn의after가 작동하지 않습니다
  • 모형의 수정


    새 열을 생성하여 모델을 수정합니다.enum를 사용하여 문자열인 경우 이 값을 DB로 정의합니다.
    admin_user.rb
    + enum role: { admin: 1, member: 2 }
    

    Ability 클래스 생성


    캔캔캔캔을 통해 키모어빌리티 클래스를 제작한다.
    그럼에도 불구하고 사용rails generete.
    rails g cancan:ability
    
    이렇게 해서 만들었다app/models/ability.rb.
    기본적으로 initialize가 있지만 특별히 기재되지 않았기 때문에 이번 조건에 맞출 것입니다.
    또 이번adminmember 두 권한 모두 실행할 수 있고admin는 읽기만 하는 인상이다.
    2017-05-28 스포츠투데이
    Shohei Nakano씨가 지적한 항목을 수정했습니다.
    (이번에는 AdminUser 모델을 사용했기 때문에 member입니다.)
    또한 매개 변수도 AdminUser.new로 수정되었다.
    app/models/ability.rb
    class Ability
      include CanCan::Ability
    
      def initialize(admin_user)
        admin_user ||= AdminUser.new
        if admin_user.admin?
          can :manage, :all
        end
    
        if admin_user.member?
          can :read, :all
        end
      end
    end
    
    권한은 기본적으로 5가지로 admin_user분배admin,manage분배member되었다.
  • read: 읽기
  • read: 신규
  • create: 업데이트
  • update: 삭제
  • destroy: 모두
  • manage 이후 허가할 권한을 지정하고 두 번째 파라미터가 허용하는 위치를 지정합니다.
    이번에는 아직 페이지가 없어서can.
    이곳의 보도는 매우 상세하게 기재되어 있다.
    How to use CanCan / CanCanCan

    테스트를 위한 뷰 수정


    테스트 권한을 부여하기 위해 보기에서 다음과 같은 내용을 보충해 주십시오.
    + <% if can? :update, current_admin_user %>
    +   <h1>You can update</h1>
    + <% end %>
    + <% if can? :read, current_admin_user %>
    +   <h1>You can read member</h1>
    + <% end %>
    
    all 사용 방법으로 권한을 확인하고 이 권한이 두 번째 파라미터를 통해 전달된 사용자라면 진짜로 되돌려줍니다.
    또 이can?를 사용할 때 은근히 다음과 같이 부른다.
    def current_ability
      @current_ability ||= Ability.new(current_user)
    end
    
    제 경우입니다. 하지만 이번can?에 AdminUser모델을 제작한 관계상 devise가 아니라 current_user를 매개 변수로 삼았으면 합니다.
    이 경우 중량을 초과할 수 있다.
    app/controllers/application_controller.rb
    + def current_ability
    +    @current_ability ||= Ability.new(current_admin_user)
    + end
    

    실제로 시험해 보다


    우선 current_admin_user의 값을 두 사용자가 테스트하면 (member)

    만 표시됩니다.
    여기에서 role의 값을 1로 바꾸면 (편집 기능 등이 없기 때문에 표를 다시 쓴다)

    업데이트 및 read를 표시합니다.
    1 관리자에 따라 모든 권한이 있기 때문에read든 업데이트든 진실로 돌아갑니다.

    devise에 새로 등록할 때도 롤을 등록해요.


    다음은 devise를 사용하는 상황입니다.
    role열을 추가했습니다. 빨대 파라미터에 추가해야 합니다.
    app/controllers/application_controller.rb
    + before_action :configure_permitted_parameters, if: :devise_controller?
    
    # 省略
    
    + private
    +   def configure_permitted_parameters
    +       devise_parameter_sanitizer.permit(:sign_up, keys: [:role])
    +   end
    
    이번 경우뿐만 아니라 추가 열거를 하려는 경우에도 그렇게 하겠다.
    devise의 공식 Giithub→https://github.com/plataformatec/devise#readme
    그리고 새로 등록할 때의 입력 창에 보충합니다.(이번에는 등록만 수정합니다.)
    app/views/devise/registrations/new.html.erb
    + <div class="field">
    +   <%= f.label :role %><br />
    +   <%= f.select :role, {'administer' => 'admin', 'member' => 'member'}, {selected: 'member', include_blank: false}, {autofocus: 'true', class: 'form-control'} %>
    + </div>
    
    roleform_for를 사용하여 다음 HTML 문을 출력합니다.
    통과select하면 통과enum하면 1통과admin하면 2가 DB에 들어간다.
    <select id="admin_user_role" name="admin_user[role]">
        <option value="admin">administer</option>
        <option value="member" selected>member</option>
    </select>
    

    좋은 웹페이지 즐겨찾기