2014-02-14 2 views
0

나는 이것을 수행하는 방법에 대해 완전히 완전히 분실했다. 세 가지 역할 : 관리자, 직원 및 기부자가 있습니다. 내 문제는 권한이없는 사용자가 URL에서 작업에 액세스하려고하면 권한 및 적절한 리디렉션을 사용하여 실제로 혼란 스럽습니다 (나에게 어쨌든). 내 UsersController에서cakePHP- 역할 인증 및 라우팅

I가 다음 작업

  1. admin_index
  2. admin_add
  3. admin_edit
  4. admin_view
  5. admin_delete

비 접두사 행동

  1. 로그인
  2. 로그 아웃
  3. 보기
  4. 추가
  5. 편집
  6. 관리자는 직원 반면, 로그인뿐만 아니라 모든 관리자-접두사 작업을 액세스하고 로그 아웃 할 수 있어야

기부자 은 후자에 대해서만 액세스 할 수 있어야합니다. 5. 모든 사용자가 동일한 로그인 양식을 사용하고 있습니다. 내 AppControlles의 구성 요소에서

나는 다음과 같은 한 :

'Auth' => array(
      'loginRedirect' => array( 
       'controller' => 'donors', 
       'action' => 'index' 
      ), 
      'logoutRedirect' => array( 
       'controller' => 'users', 
       'action' => 'login' 
      ), 
      'authorize' => array('Controller') 
) 

하지만, 내 로그인 행동에서 나는 그에 따라 loginRedirect을 변경하려면 사용자 역할에 대해 확인 :

if($this->request->is('post')){ 
      if($this->Auth->login()){ 

      switch($this->Auth->user('role')){ 
       case 'admin': 
        $this->Auth->loginRedirect = array('controller'=>'users','action'=>'admin_index','prefix'=>'admin','admin'=>true); 
        break; 
       case 'donor': 
       ... 
       break; 
       case ..... 
      } 
     } 
} 

질문 1 자, donor 역할을 가진 현재 사용자가 로그인하여 localhost/sitename/admin/users/add에 액세스하려고 시도하면 그는 /donors이 아닌 admin/donors으로 리디렉션됩니다. 그러면 관리자 접두어를 어떻게 제거 할 수 있습니까?

질문 2 난 충분히 이해가 안 돼요 $ this-> Auth-> allow(), works .. 내 donorsController에서 역할에 따라 컨트롤러 작업에 대한 액세스를 제어하고 싶다면 어떻게해야합니까? 그것? 예를 들어, donorsController에 'delete'액션이있는 경우, 기부자 사용자가 삭제 작업에 액세스하는 것을 거부하는 동안 직원 사용자를 어떻게 허용 할 수 있습니까? 나는 beforeFilter가 해결책이라고 믿지만 그것을하는 법을 찾을 수 없다! 어떤 포인터? 감사합니다.

+1

항상 정확한 cakephp 버전을 언급해야합니다. 팁 : 여기서 거대한 컨트롤러 코드 오버 헤드를 만드는 대신 간단한/로그인 폼과 [Tiny] (http://www.dereuromark.de/2011/12/18/tinyauth-the-fastest- and-easiest-authorization-for-cake2 /)를 Auth 방식으로 사용합니다. 이렇게하면 각 작업이 명확하게 정의되고 액세스 권한이없는 경우 모든 작업이 중앙 로그인 양식으로 /로 리디렉션됩니다. – mark

+0

답안을 보내 주셔서 감사합니다! 나는 당신의 블로그를 살펴보고 깨끗해 보인다. 그러나 역할은 사용자의 테이블에서 필드가 아닌 모델로 정의되므로이 설정은 필요하지 않습니다. 또한 $ this-> Auth-allow()가 작동하는 방법을 이해하는 데 여전히 문제가 있습니다. 물론 내가 가지고있는 설정으로 다시 시작할 수 있기를 바랍니다. 감사! – LogixMaster

+1

사용자 테이블 필드 만 작동합니다. 그것을위한 문서를 읽으십시오. 모델 일 필요는 없습니다. – mark

답변

1

1)를 참조 할 수 있습니다. 관리자가 아닌 사람이 다른 사람에게 리디렉션하는 경우

if ($this->Auth->login()) { 
    if ($this->Auth->user('role') === 'admin') { 
     $this->redirect(array(
      'admin' => true, 
      'controller' => 'foo', 
      'action' => 'bar'))); 
    } else { 
     // Do something else, another redirect or whatever 
    } 
} 

그는 허용되지 않는 URL에 액세스하려고 할 때 권한이없는 사용자 HES를 표시해야합니다 같은 URL에서/관리자를 제거 할 필요가 없습니다.

2) 다른 역할에 대한 액세스 권한을 부여하려면 내가 작성한 SimpleRbacAuth을 사용할 수 있습니다. 작동 원리는 Check the tests for examples입니다. 중첩 된 배열 구조를 정의하고 원하는 역할을 작업이나 전체 컨트롤러에 추가하거나 *를 사용하여 모든 사람에게 액세스 권한을 부여하기 만하면됩니다.

+0

나는 확실히 rbac 코드를 확인합니다! 그러나 로그인 작업에서 역할을 확인하는 것은 내가 이미 수행하고있는 작업이므로 (따라서이 질문에는별로 도움이되지 않지만 방문자에게는 도움이 될 수 있음)! – LogixMaster

1

이것은 해결책이 될 수 있습니다.

core.php 파일로 이동하고 주석이 있으면 주석 처리를 제거하고 아래 라인이없는 경우 추가하십시오.

Configure::write('Routing.prefixes', array('admin')); 
Location: app/config/core.php 

는 AppController.php (케이크 버전 2.x)/app_controller.php (케이크 버전 < (2)의 내측으로, beforeFilter 방법 아래 코드를 삽입.X)

function beforeFilter(){ 
    if($this->Auth->user('role') == 'admin'){ 
     if(!in_array($this->params['action'],array('login','logout')) && (stristr($this->params['action'], 'admin_') === FALSE)){ 
      $this->redirect(array("controller"=>$this->params['controller'],"action"=>'admin_'.$this->params['action'],"admin" => 1)); 
     } 
    }else{ 
     if(stristr($this->params['action'], 'admin_')){ 
     $action = explode('_',$this->params['action']); 
     $this->redirect(array("controller"=>$this->params['controller'],"action"=>$action[1],"admin" => false)); 
     } 
    } 
} 

사용자 지정 오류 페이지를 처리하여 관리 할 수있는 나머지 기능은 다음과 같습니다.

당신은 역할이 관리자가 어떤 컨트롤러/액션로 리디렉션 및 관리자 접두사를 설정 한 경우 작업이 사용자의 역할에 대한 검사를 impelement() 로그인에 Customize error pae

+0

이것은 복잡하지 않습니다. 요청에 '접두어'가 있으며 접두사에 대한 작업을 구문 분석 할 필요가 없으며 로그인 및 로그 아웃 작업은 인증 구성 요소 설정에 의해 정의 될 수 있습니다. – burzum

+0

고마워요! 이 질문은 정확히 URL에서 관리자 접두사를 제거하기 때문에 원하는 내용이 아닐 수도 있습니다. 따라서 이것을 대답으로 표시하십시오. 실제로이 일을 할 수 있다고 생각합니다! 또한 hightlighting에 +1 오류 페이지를 사용자 정의하십시오! – LogixMaster

+0

@ burnzum 친절하게도이 문제에 대해 자세히 설명 할 수 있습니까? 왜 이렇게 복잡합니까? 아니면 더 좋은 방법이 있습니까? 감사합니다. – LogixMaster