2009-11-05 5 views
0

CodeIgniter를 사용하여 사이트에 관리자 섹션을 작성하고 있습니다. Controller 클래스를 확장하는 Admin 클래스를 작성하면 관리 페이지의 컨트롤러는 Admin까지 확장됩니다. Admin 클래스가 사용자의 세션을 확인하여 로그인했는지 확인하고 싶지 않은 경우 로그인 페이지를 표시하고 클래스의 초기화를 중단하기 때문에이 작업을 수행합니다.사용자가 로그인하지 않은 경우 어떻게 PHP 클래스 초기화에서 벗어날 수 있습니까?

저에게는 멋진 추상화처럼 보입니다. 사용자가 관리 페이지 및 기능에 로그인하는 것에 대해 걱정하지 않고 그냥 쓰고 수퍼 클래스가 걱정하게하지 마십시오. 하지만 어떻게해야합니까?

Admin 생성자에서 예외가 발생하면 하위 클래스가 생성되지 않도록 하위 클래스가 중지됩니까? 이 작업을 수행하는 더 좋은 방법이 있습니까? 이전에 MVC를 사용한 적이있는 사람, 전에 이런 식으로 처리 한 적이 있습니까?

답변

2

show_error()는 native PHP의 die()와 유사합니다. 뷰를 모델링하거나 또는 컨트롤러 (더 일반적으로 컨트롤러)라고 불리는 위치에 관계없이 즉시 실행을 중단하고 오류 문자열을 표시합니다. 통화까지 발생하는 모든 상태 조작은 취소되지 않습니다.

권한 확인을 수행하는 가장 좋은 방법은 다른 사람들이 다른 솔루션을 추천 해 주겠지 만 일반적으로 내가 취하는 접근 방식을 제공 할 수 있습니다.

관리자가 관리자가 아닌 사용자가 여러 명인 사이트에서 비 숙련 된 최종 사용자가 될 경우 사용자 데이터베이스 테이블에 플래그를 만들고 사용자 행을 사용자 지정 제어기 MY_Controller. 그런 다음 다른 기능에 다른 권한 제한이있는 경우 컨트롤러 클래스의 각 기능에 대한 체크 만 첨부하면됩니다. 그들 모두가 같은 권리 제한을 가지고 있다면 @Lukman이 제안한 것처럼 그것을 컨트롤러에 넣을 것입니다.

관리자가 사용자 환경과 완전히 다른 경우 관리자 하위 도메인을 만들고이 도메인에 CI를 설치하는 것이 좋습니다. 그렇게하면 권한을 관리하는 글로벌 사용자 지정 컨트롤러를 설정하는 것 이외의 다른 것에 대해 걱정할 필요가 없습니다.

귀하의 경우, 제가 취하는 접근 방식은 조금 다릅니다. 나는 커스텀 콘트롤러를 만들고 그것으로부터 사이트의 모든 콘트롤러를 확장 할 것이다. (나의 의견으로는 좋은 연습이다. 해당 컨트롤러에서 다음을 실행합니다.

if(strcasecmp($this->uri->segment(1) , 'admin') === 0) 
    if($this->session->userdata('admin') !== 1) 
     show_error('Access Prohibited'); 
1

Admin 클래스의 생성자에서 사용자가 로그인되어 있는지 확인하고 그렇지 않은 경우 로그인 페이지로 리디렉션합니다.

public function __construct() { 
    // assuming you have your user authentication handled by UserLogin class 
    if (!UserLogin::is_logged_in()) { 
    redirect("/uri/to/login/page"); 
    die; 
    } 

    // do normal stuff 
    parent::__construct(); 
} 
+0

이 작업을 수행하려면 URI 도우미 클래스를로드해야합니까? –

+0

예,'redirect()'함수를 얻기 위해 URL 도우미를로드해야합니다. – Lukman

0

여기서 "is a"테스트를 적용 해 보시기 바랍니다. "(n)"관리자가 컨트롤러입니까? 나는 안된다고. 오히려 관리 페이지에 대한 액세스를 제공하는 컨트롤러는 "관리자 인증 필요"라는 속성을 가질 수 있습니다. 따라서 컨트롤러 클래스의 데코레이터를 사용하여 액세스 제어를 수행해야하는 것처럼 보입니다. admin 섹션의 경우 "Admin 액세스 컨트롤러"를 설정할 수 있으며 관리자가 아닌 섹션의 경우 기본 작업으로 아무것도 수행하지 않는 기본 클래스 나 null로 설정할 수 있습니다.

당신의 길은 아마도 잘 작동 할 것이고, 나는 "디자인이 어떻게 보일 것인가"라는 각도에서 좀 더 접근하고 있습니다.

+0

좀 더 명확하게 분류 할 수 있습니까? Admin 서브 클래스가 컨트롤러를 확장 할 때 컨트롤러 클래스의 "데코레이터"가된다는 의미였습니다. 그 하위 클래스에 대해 자동 인증을하고 다른 것들 중에서 사이트에 머리글과 바닥 글을 추가하는 내용을 표시하기위한보기 기능을 추가 할 것입니다. –

+0

인증/액세스 제어 데코레이터를 추가하는 쉬운 방법이 무엇인지 알기 위해 기본 컨트롤러 클래스의 소스를 찾으려고했지만 부족한 부분이 있습니다. – Zak

+0

죄송합니다.이 말은 제가 말한 것에 대한보다 완전한 설명을 제공합니다 : 불행히도 기본 CI 컨트롤러 클래스는 실행 전 컨트롤러 메서드에 간단한 데코레이터 추가 기능을 제공하지 않지만 보이지 않습니다. 컨트롤러가 실행됩니다. 자세한 내용은이 페이지를 참조하십시오. http://www.echovsprint.com/2009/04/role-based-access-control-in-codeigniter-using-hooks/ – Zak

관련 문제