2012-03-20 4 views
11

CakePHP 2.0의 통합 된 Auth 구성 요소를 사용하고 있습니다.

User belongsTo Group 
User hasMany Profiles 

동안은에 로그인 한 다음과 같이 프로필

내 모델 관계이

  • 사용자
  • 그룹
  • : 나는 다음과 같은 테이블이 그만큼 사이트에서 Auth 세션에 User 테이블 정보 만 포함되어 있음을 알았지 만 로그인 한 사용자에 대해서도 Groups 및 Profiles 테이블의 정보가 필요합니다.

    인증 구성 요소를 사용하여이를 수행 할 수있는 방법이 있습니까?

답변

6

AuthComponent은 세션 키를 처리하는 방식 때문에이 방법을 사용할 수 없습니다. 그러나 세션에 직접 저장할 수는 있습니다.

: 컨트롤러가 얻을 수에 대한 귀하의 AppControllerbeforeFilter()에서 다음

function login() { 
    if ($this->Auth->login($this->data)) { 
     $this->User->id = $this->Auth->user('id'); 
     $this->User->contain(array('Profile', 'Group')); 
     $this->Session->write('User', $this->User->read()); 
    } 
} 

, var에 저장 :

이 작업을 수행 할 수있는 유일한 방법은 사용자가 로그인 할 때 세션에 추가하는 것입니다

function beforeFilter() { 
    $this->activeUser = $this->Session->read('User'); 
} 

// and allow the views to have access to user data 
function beforeRender() { 
    $this->set('activeUser', $this->activeUser); 
} 

업데이트 : CakePHP 2 기준2 (announced here), 이제 AuthComponent는 세션에 추가 정보를 저장하기위한 '포함'키를 허용합니다.

+0

세션에서 사용자를 설정할 때주의 할 단어. 사용자가 더 이상 인증되지 않아도 세션 데이터가 설정된 상태로 남아있을 수 있습니다. 로그 아웃 할 때 세션 데이터가 삭제되었는지 확인해야합니다. "User"가 아닌 "Auth.User"에 세션을 저장하면됩니다. +1하여 CakePHP 2.2 업데이트에 대한 답변을 업데이트하십시오. – drmonkeyninja

1

필자는 Auth 구성 요소가 Users 모델의 데이터 만 캐시한다는 것을 알고 있습니다. 당신은 예를 들어 컨트롤러에이를 사용하여, 다른 모델에서 원하는 데이터를 검색하기 위해 해당 정보를 사용할 수 있습니다

$group_data = $this->Group->findById($this->Auth->user('group_id')); 

또는

$profile_data = $this->Profile->findByUserId($this->Auth->user('id')); 

그러나 나는 당신에서 그것을 얻을 수 있다고 생각하지 않습니다 Auth 구성 요소는 관련 모델 데이터를 상자 밖으로 캐시하지 않으므로 직접 인증 구성 요소에 전달됩니다.

+0

나는 AUTH에서 시도하기 때문에 사이트를 통해 모든 정보가 필요합니다. 그래서 찾기 쿼리를 작성하고 싶지 않아 .. :) – AnNaMaLaI

1

두 가지 방법 :

1) (/ 컨트롤러/컴포넌트/인증 참조) FormAuthenticate 클래스를 확장하거나 로그인하여 _findUser() 메소드를 오버라이드 (override) 해,이 권한 부여 클래스를 사용하는 인증 구성 요소에게 무엇이든 사용할 수 있습니다. 이 모든 방법을 참조하십시오 http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

2) 원하는 모든 데이터를 가져 와서 컨트롤러의 로그인 메소드에서 호출하고 세션에 데이터를 쓰는 모델의 메소드를 구현하기 만하면됩니다. IMO 가끔 그런 방법으로 세션 데이터를 새로 고침해야하기 때문에 편리합니다. 당신은 방법 및 당신에게 데이터를 반환하는 모델에서 코드를 작성해야합니다

: 때문에 다른 대답에 귀하의 코멘트의

. CakePHP는 코드없이 마음과 데이터베이스를 읽을 수 없습니다. 두 가지 방법 중 어느 것을 사용하든 관계없이 코드를 작성해야합니다.