2009-10-13 2 views
2

스토어, 스토어 hasMany 제품 (hasMany 스태프, hasMany EquipmentItem 등)CakePHP : 모델 기반 권한? > 스토어 - -> 제품 (직원, EquipmentItem 등)</p> <p>... 클라이언트 hasMany의</p> <p>클라이언트 : 최고의 다음 모델 계층 구조와 클라이언트 수준의 인증을 처리하는 방법에 대한 결정에 고투

사용자와 클라이언트간에 HABTM 관계를 설정했습니다.이 작업은 인증 세션이나 사용자 모델의 정적 메서드를 통해 간단하고 액세스 할 수 있습니다. 필요한 것 (afterFind 설명은 아래 참조).

지금 당장은 각 모델의 afterFind 콜백에서 결과를 평가하고 현재 사용자가 구성원 인 클라이언트에 대해 쿼리하는 모델을 기반으로 클라이언트와의 관계를 확인합니다. 현재 모델이 클라이언트 인 경우 ID를 확인합니다. 현재 모델이 Store 인 경우 Store.clientid를 확인하고 마지막으로 Product 인 경우 Item.storeid에서 상위 Store를 가져 와서 Store.clientid를 적절하게 확인하십시오.

그러나 적절한 MVC를 유지하기 위해 afterFind에서 true 또는 false를 반환하고 호출 동작의 반환을 확인해야합니다. 괜찮습니다. 그러나 생각할 수있는 방법이 없습니다. afterFind에서 Client 권한을 찾거나 찾지 못하여 유효하지 않은 ID로 인해 Model-> find (또는 Model-> read 등)가 false를 반환하는지 확인합니다. 그것은 또한 모든 행동을 수정해야한다는 것을 의미합니다.

내가 해왔 던 다른 방법은 app_controller.beforeFilter에서 요청을 평가하고 컨트롤러/action/id에 요청을 분류하여 적절한 모델을 쿼리하고 필드에 대해 평가할 수 있습니다. Auth.User.clients 배열을 사용하여 사용자가 요청한 클라이언트에 액세스 할 수 있는지 여부를 확인합니다. 이것은 괜찮은 것 같지만,/컨트롤러/인덱스를 처리하기 위해 어떤 식 으로든 (afaik) 남겨 두지 않습니다. 인덱스 결과가 클라이언트 멤버쉽을 반영한다는 것이 논리적으로 보입니다.

둘 다의 결함에는 현재 모델/작업/ID가 클라이언트의 컨텍스트에있는 위치를 결정하기 위해 분석해야하는 조건부 "규칙"의 긴 목록이 포함됩니다. 결국, 둘 다 조금 부서지기 쉽고 나에게 복잡하게 느껴진다.

제 3의 옵션이 있습니까?

답변

0

이것은 Cake ACL의 일처럼 들립니다. 학습 곡선의 비트이지만, 일단 당신이 그것을 알아 내면,이 방법은 매우 강력하고 유연합니다.

Cake의 ACL (액세스 제어 목록)을 사용하면 사용자를 CRUD (읽기 업데이트 삭제 만들기) 수준까지 컨트롤러에 연결할 수 있습니다. 왜 그것을 사용합니까?

1) 코드는 이미 사용 중입니다. AuthComponent는 이미 내장되어 있습니다. 2) 강력하고 통합되어있어 사이트의 모든 작업을 제어 할 수 있습니다. 3) 이미 사용 해본 다른 케이크 개발자로부터 도움을 얻을 수 있습니다. 4) 처음 설치하면 다른 응용 프로그램에서 전체 사이트 권한을 훨씬 쉽고 빠르게 구현할 수 있습니다.여기

몇 가지 링크입니다 :

http://bakery.cakephp.org/articles/view/how-to-use-acl-in-1-2-x http://book.cakephp.org/view/171/Access-Control-Lists http://blog.jails.fr/cakephp/index.php?post/2007/08/15/AuthComponent-and-ACL

아니면 그냥 CakePHP의 ACL에 대한 구글 수

+1

나는 ACL에보고하고, 한 내가, 읽은 것과 행 또는 모델 기반 인증을 위해 작동하지 않습니다 (권장하지 않습니다). – gravyface

+0

모델 수준에서 사용 권한의 이점을 잘 모르겠습니다. 그러나 UUID를 사용하고 모든 테이블간에 하나의 사용 권한 HABTM 테이블을 만드는 것을 고려해 보았습니까? 그런 다음 사용 권한을 확인하기 위해 사용자 지정 모델 바인딩을 사용할 수 있습니다. 당신의 beforeFind에서 bindModel ('permissions')을 넣으십시오. 그런 다음 권한을 관리하려면 사용자 정의 bindModels 등이 필요합니다. – Dooltaz

관련 문제