2016-12-23 3 views
1

내 사이트에는 30 개의 기능에 대한 링크가있는 관리자 섹션이 있습니다. 우리는 각 고객 서비스 담당자에게 매우 세분화 된 개별 레벨 (즉, 조는 페이지 A와 B는 액세스 할 수 있지만 C는 액세스 할 수 없으며 Mary는 A와 C에 대한 액세스 권한이 부여됨)에서 이러한 페이지에 액세스 할 수 있도록하려고합니다. , B가 아니라).Pundit 또는 CanCan gem이 사용자 별, 컨트롤러 별 권한을 허용합니까?

Pundit 또는 CanCan이 이와 같이 작동합니까? 아니면 각 관리 기능에 대한 부울 열이있는 사용자와 관련된 사용 권한 모델을 만드는 것이 더 좋습니까? 내가 그것을 빨리 볼 수있는 것을 피하기를 바랬습니다.

+0

학자는 사용자 ID와 사용자의 모든 다른 속성을 포함하는'current_user' 개체에 대한 액세스를 제공합니다. 사용자별로 사용 ​​권한을 정의하는 데 사용할 수없는 이유가 없습니다. – moveson

+0

@moveson 어디에서 사용자 별 권한 정보를 저장하나요? User 모델에 ~ 30 개의 추가 열을 추가하고'current_user.page_a_access? '와 같은 것을 실행하십시오. –

+1

하나의 정수 열을 User 모델에 추가하고 [bitwise] 저장할 수 있습니다 (http://blog.millermedeiros.com/using-integers -to-store-multiple-boolean-values ​​/)를 지정합니다. [SO] (http://stackoverflow.com/questions/9643491/store-multiple-bit-values-in-a-single- table- column)에 대한 예가 있습니다. – moveson

답변

2

각 기능에 대한 열을 만드는 대신 단일 정수 열을 사용하고 비트 마스크를 사용하여 N 개의 부울 값을 저장할 수 있습니다. 원하는 경우 Bitfields과 같은 루비 라이브러리가 있습니다.

또 다른 방법은 관리자와 기능간에 조인 테이블 (habtm 관계)을 만드는 것입니다 (아직 지원되지 않는 기능을 DB 지원 모델로 추가하는 경우). 권한을 부여하는 것은 조인 테이블 다음 예는 다음과 같습니다

class User < ApplicationRecord 
    has_and_belongs_to_many :features 
end 

class Feature < ApplicationRecord 
    has_and_belongs_to_many :users 
end 

# authorization 
def authorized?(current_user, requested_feature) 
    current_user.features.where(id: requested_feature.id).exists? 
end 
+1

나는 Bitfields 제안에 대해 흥분했지만 32 불린으로 제한되어있어 불행히도 효과가 없을 것 같습니다. 후자의 해결책은 내가 원래 염두에 두었던 것이지만 새 페이지를 추가 할 때마다 데이터베이스 마이그레이션을 만들어야하는 것을 피하고 싶습니다. 직렬화 된 해시를 대신 사용하려고합니다. 그래도 도와 ​​줘서 고마워! –