칸칸칸으로 해볼게요.
사용자가 쉽게 권한을 부여할 수 있는 CanCanCan을 가져왔습니다.
공식 Giithub→https://github.com/CanCanCommunity/cancancan#readme
Gemfile 업데이트
Gemfile+ gem 'cancancan'
bundle install
참고로 bundle install과 업데이트의 차이는 아직 잘 모르겠어요. 간단하게 말씀드리겠습니다.
+ gem 'cancancan'
bundle install
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에서는 지정된 위치에 열을 추가할 수 없습니다.
rails g migration add_role_to_admin_users role:integer
class AddRoleToAdminUsers < ActiveRecord::Migration[5.0]
def change
add_column :admin_users, :role, :integer, null: false, default: 2
end
end
모형의 수정
새 열을 생성하여 모델을 수정합니다.enum
를 사용하여 문자열인 경우 이 값을 DB로 정의합니다.
admin_user.rb+ enum role: { admin: 1, member: 2 }
Ability 클래스 생성
캔캔캔캔을 통해 키모어빌리티 클래스를 제작한다.
그럼에도 불구하고 사용rails generete
.rails g cancan:ability
이렇게 해서 만들었다app/models/ability.rb
.
기본적으로 initialize
가 있지만 특별히 기재되지 않았기 때문에 이번 조건에 맞출 것입니다.
또 이번admin
과 member
두 권한 모두 실행할 수 있고admin
는 읽기만 하는 인상이다.
2017-05-28 스포츠투데이
Shohei Nakano씨가 지적한 항목을 수정했습니다.
(이번에는 AdminUser 모델을 사용했기 때문에 member
입니다.)
또한 매개 변수도 AdminUser.new
로 수정되었다.
app/models/ability.rbclass 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
되었다.
+ enum role: { admin: 1, member: 2 }
캔캔캔캔을 통해 키모어빌리티 클래스를 제작한다.
그럼에도 불구하고 사용
rails generete
.rails g cancan:ability
이렇게 해서 만들었다app/models/ability.rb
.기본적으로
initialize
가 있지만 특별히 기재되지 않았기 때문에 이번 조건에 맞출 것입니다.또 이번
admin
과 member
두 권한 모두 실행할 수 있고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>
role
의 form_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>
Reference
이 문제에 관하여(칸칸칸으로 해볼게요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/naoki85/items/266c8d7ab469cc6ab1fe
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
+ <% 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 %>
def current_ability
@current_ability ||= Ability.new(current_user)
end
+ 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>
role
의 form_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>
Reference
이 문제에 관하여(칸칸칸으로 해볼게요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/naoki85/items/266c8d7ab469cc6ab1fe
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
+ before_action :configure_permitted_parameters, if: :devise_controller?
# 省略
+ private
+ def configure_permitted_parameters
+ devise_parameter_sanitizer.permit(:sign_up, keys: [:role])
+ end
+ <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>
<select id="admin_user_role" name="admin_user[role]">
<option value="admin">administer</option>
<option value="member" selected>member</option>
</select>
Reference
이 문제에 관하여(칸칸칸으로 해볼게요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/naoki85/items/266c8d7ab469cc6ab1fe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)