본문 바로가기

Yii Framework/블로그 만들기

07. 사용자 인증

이 곳은 제가 개인적으로 YII framework의 블로그 만들기를 번역해 놓은 곳입니다.

제가 영어 전공자도.. 그렇다고 영어랑 친하지도 않습니다. 

그래서 보시면 뭔가 글도 엉성하고 말이 안맞는게 많습니다.

잘못 오역된 부분이라던지 그런 부분들 친절하게 알려주시면 바로 수정하겠습니다.

이 페지의 원글 http://www.yiiframework.com/doc/blog/1.1/en/prototype.auth



사용자 인증

블로그 응용 프로그램은 시스템 소유자 및 게스트 사용자를 구별해야합니다. 따라서, 우리는 사용자 인증 기능을 구현해야합니다.

기본어플리케이션에서 이미 사용자 이름과 비밀번호가 demo또는 admin 으로 사용자 인증 기능을 제공하고 있다는것을 확인 할 수 있을 것 입니다. 이 섹션에서는 사용자 인증을 User 데이터베이스 테이블을 기반으로 하도록 해당 코드를 수정합니다.

사용자 인증은 IUserIdentity 인터페이스를 구현하는 클래스에서 이루어집니다. 기본응용프로그램은 이 목적을 위해 UserIdentity 클래스를 사용하고 있습니다. 이 클래스파일은 /wwwroot/blog/protected/components/UserIdentity.php 에 저장되어 있습니다.

팁 : 규칙에 따라 클래스 파일 이름은 해당 클래스 이름에 접미사로 확장 . php 를 붙인 것으로 해야 합니다. 이 규칙에 따르면, 경로 별칭 을 사용하여 클래스를 참조 할 수 있습니다. 예를 들어 UserIdentity 클래스를 application.components.UserIdentity 라는 별칭으로 참조 할 수 있습니다. Yii는 많은 API가 경로 별칭을 인식합니다 (예 Yii :: createComponent () ). 그리고 경로 별칭을 사용하면 코드에 절대 경로를 포함 할 필요가 없습니다.
코드에 포함 된 절대 경로는 종종 응용 프로그램 배포시 문제가 발생합니다.

UserIdentity 클래스를 다음과 같이 수정합니다.

<?php
class UserIdentity extends CUserIdentity
{
    private $_id;
 
    public function authenticate()
    {
        $username=strtolower($this->username);
        $user=User::model()->find('LOWER(username)=?',array($username));
        if($user===null)
            $this->errorCode=self::ERROR_USERNAME_INVALID;
        else if(!$user->validatePassword($this->password))
            $this->errorCode=self::ERROR_PASSWORD_INVALID;
        else
        {
            $this->_id=$user->id;
            $this->username=$user->username;
            $this->errorCode=self::ERROR_NONE;
        }
        return $this->errorCode==self::ERROR_NONE;
    }
 
    public function getId()
    {
        return $this->_id;
    }
}

authenticate () 메소드에서는 User 클래스를 이용하여 tbl_user 테이블 중에서 username 컬럼이 주어진 username 과 동일한 행을 대소문자 구분방식으로 찾습니다. User 클래스는 이전 섹션에서 gii도구에 의해 만들어진 것임을 기억하십시오. User 클래스는 CActiveRecord 를 상속하고 있기 때문에, ActiveRecord 기능 을 이용하여 객체 지향 (OOP)의 방식으로 tbl_user 테이블에 액세스 할 수 있습니다

사용자가 유효한 암호를 입력했는지 여부를 확인하기 위해 User 클래스의 validatePassword 메소드를 호출합니다. /wwwroot/blog/protected/models/User.php 를 다음과 같이 수정해야 합니다.  일반 암호를 데이터베이스에 저장하는 것이 아니라 암호 해시 결과를 무작위로 발생한 salt key 함께 저장하는 것에주의하십시오. 사용자가 입력 한 암호를 확인 할 때 암호 대신 해시 된 결과를 비교하는 것입니다.

class User extends CActiveRecord
{
    ......
    public function validatePassword($password)
    {
        return $this->hashPassword($password,$this->salt)===$this->password;
    }
 
    public function hashPassword($password,$salt)
    {
        return md5($salt.$password);
    }
}

UserIdentity 클래스는 getId () 메서드를 재정의하고 tbl_user 테이블에서 발견 된 사용자 id 를 반 합니다. 원래 구현 대신 사용자 이름을 반환하도록 되어 있었습니다. username 과 id 속성은 모두 사용자 세션에 저장된 코드로, 어디서나
Yii :: app () -> user 로 액세스 할 수 있습니다.


팁:
 UserIdentity 클래스에서는 해당 클래스 파일을 명시 적으로로드하지 않고도 CUserIdentity 를 참조하고 있습니다. 이것은 CUserIdentity 이 Yii framework의 코어 클래스이기 때문입니다. Yii는 모든 코어 클래스가 처음 참조 될 때 자동으로 그 클래스 파일을로드합니다.

User 클래스에서도 같은 일이 벌어지고 있습니다. 왜냐하면, User 클래스 파일이 /wwwroot/blog/protected/models 디렉토리에 있고, 그 디렉토리가 응용 프로그램 초기 구성 아래 코드에서 PHP의 include_path 에 추가되어 있기 때문입니다.
return array(
    ......
    'import'=>array(
        'application.models.*',
        'application.components.*',
    ),
    ......
);

위의 초기 구성은 /wwwroot/blog/protected/models or /wwwroot/blog/protected/components 아래에 클래스 파일이있는 모든 클래스 먼저 클래스를 참조 할 때 자동으로 로드되는 것을 입니다.

UserIdentity 클래스는 주로 LoginForm 클래스에서 로그인 페이지에서 입력 된 사용자 이름과 암호를 바탕으로 사용자를 인증하는 데 사용됩니다. 다음 코드 조각에서 UserIdentity 가 어떻게 사용되는지를 보여줍니다.


$identity
=new UserIdentity($username,$password); $identity->authenticate(); switch($identity->errorCode) { case UserIdentity::ERROR_NONE: Yii::app()->user->login($identity); break; ...... }

정보: 사람들은 종종 identity 와 user 어플리케이션 구성요소에 대해서 혼란에 빠집니다.전자는 인증 방법이고, 후자는 현재 사용자에 대한 정보를 나타냅니다. 응용 프로그램을 가질 user 구성 요소는 하나 뿐이지 만, identity 클래스는 어떤 인증 방법을 지원 하느냐에 따라 하나 이상의 클래스를 가질 수 있습니다. 일단 인증이 성공하면 identity 인스턴스에서 user 요소에 인증 정보를 전달하고 응용 프로그램 전체에서 user 를 이용하여 액세스 할 수 있습니다.

수정 된 UserIdentity 클래스를 테스트하기 위해, 브라우저에서 URLhttp://www.example.com/blog/index.php 에 액세스하여 tbl_user 테이블에 저장 한 사용자 이름과 비밀번호로 로그인을 시도해 보십시요. 블로그 데모 에서 제공되는 데이터베이스를 사용하는 경우, 사용자 이름 demo 암호 demo 에 액세스 할 수 있어야합니다. 이 블로그 시스템은 사용자 관리 기능이없는 점에 유의하십시오. 결과적으로 사용자는 웹 인터페이스를 통해 자신의 계정을 변경하거나 새로운 계정을 만들거나 할 수 없습니다. 사용자 관리 기능은 블로그 프로그램의 앞으로의 확장으로 간주 될 수 있습니다.