2012-06-27 3 views
5

웹 사이트를 구축 할 때 좀 더 쉬운 문제를 해결하여 OOP 기술을 향상시키기 시작했습니다. 그래서 로그인 시스템으로 시작했는데, 나는 유튜브 튜토리얼을 따라 Login 클래스를 만들 수 있었다.하지만 계속 진행하면서 많은 의심을 불러 일으켰다. (코드는 100 라인이므로 붙여 넣기 할 것이다.).PHP에서 객체 지향 로그인 시스템의 클래스 디자인

이 로그인 클래스에는 확인 방법 등이 있지만 세션 매개 변수가 생성되기 전에 주어진 매개 변수와 함께 사용할 수 없습니다 (이 클래스 범위에서 최소한) :

$this->_username = ($this->_login)? $this->filter($_POST['username']) : $_SESSION['username']; 
    $this->_password = ($this->_login)? $this->filter($_POST['password']) : ''; 
    $this->_passmd5 = ($this->_login)? md5($this->_password) : $_SESSION['password']; 

그래서 세션 변수가 설정되어 있지 않은 경우 verifySession() 메소드를 사용할 수 없습니다. 예를 들어 로그인 한 사용자가 메인 페이지에 표시해야하는 것과는 구분됩니다.

제 질문은 - 설계가 정확하고 로그인 시스템의 나머지 부분을 어떻게 구축해야합니까? 모든 페이지에서 loggedIn 확인 및 로그 아웃 - 각 클래스가 별도의 클래스에 있어야하며 메소드는 무엇인지, 특정 클래스에서 반복, 나는 항상 그들을 상속해야합니다). OOP에 대한 다양한 접근 방식이 있다는 것을 알지만, 초보자로서 따라야하는 특정 사항이 있습니다.

+0

나는 당신이 여기에 무엇을 묻는 지 이해할 수 없다. (아마도 그것을 명확히 할 수 있을까?) 일반적으로 : 원래의 개념과 모델 (실제)을 수업에 따라하는 것이 좋습니다. "로그인"은 일이 아니지만 세션과 사용자가 있습니다. – Niko

+0

내가 패턴을 찾고 있는데, 객체 지향 로그인 시스템 (로그인, 로그 아웃, 사용자가 모든 페이지에 로그 인한 경우 veryfing)을 빌드하고,이 모든 것들이 내부에 있어야하는지 잘 모르겠다. single class – Malyo

답변

3

"나는 YouTube 튜토리얼을 따랐다"는 첫 번째 문제입니다. 붙여 넣은 코드 세 줄만 보면 아마추어 PHP 개발자가 본 비디오를 볼 수 있습니다.

- 세 개의 라인이 게시 된 이후

, 나는 디자인이 알고하지 않습니다 "그래서 내 질문은 그 디자인 정확하고, 내가 어떻게 로그인 시스템의 나머지를 구축해야한다" 맞다. 나는 내기하지 않을거야.

객체를 사용할 때 좋은 규칙은 코드가 두 개 이상의 기능을 필요로하기에 충분히 명확하고 응용 프로그램의 여러 위치에서 사용되며 이름 충돌이 발생할 가능성이 클 경우입니다. 코드는 객체 또는 네임 스페이스에 캡슐화되지 않습니다. 이것은 기준을 충족시키지 못합니다. 로그인 및 등록 화면은 각각 한 페이지 (최대)이므로 해당 코드는 한 번만 사용됩니다. 그 논리를 캡슐화 할 이유가 없습니다. Niko는 일반적인 패턴이고 캡슐화 할 수있는 세션 및 사용자 클래스에 대해 언급했습니다.

로그인 시스템을 구축하는 데에는 복잡해지고 요즘에는 거의 전문화되어 있습니다.

가 SSO 클라이언트가 '아무튼

http://barebonescms.com/documentation/sso/

:에서 위의 위키 문서를 다음과 사전 패키징 시스템을 원하는 경우

The definitive guide to form-based website authentication

, 당신은 볼 수 있습니다 : 나는 다음과 같은 SO 위키 기사를 읽어 보시기 바랍니다 SSO_LoggedIn(), SSO_Login(), SSO_Logout() 등과 같은 함수 집합 만 응용 프로그램에 제공 할 수 있습니다. 간단한 작업만으로 충분할 때 OOP을 수행하기 위해 OOP를 수행하는 것은 소프트웨어를 작성하는 잘못된 방법입니다. 때때로 기능이 더 좋습니다. 때때로 코드를 인라이닝하는 것이 좋습니다. 정말 달려 있으며, 최선의 접근 방법에 대한 통찰력을 얻으려면 수년 간의 경험이 필요합니다.

+0

정말 고마워요. 정확하지 않은 질문에 대해 유감스럽게 생각합니다. 코드를 정확하게 작성하려면 많은 코드가 필요합니다. – Malyo

4

정말 "로그인"클래스를 원하지 않습니다. 당신이

class User 
{ 
    private $username; 
    private $password; 

    public function __construct($username) 
    { 
    //load this user object here 
    } 

    private function hashPassword($password) 
    { 
     ///Dont do this has the hash, but im just keeping it simple 
     return md5($password . 'a}{[email protected]#' . $this->username); 

    } 

    public function authenticate ($password) 
    { 
     return $this->hashPassword($password) == $this->password; 
    } 

} 

login.php

$user = new User($_POST['username']); 
if($user->authenticate($_POST['password'])) 
{ 
//do session initilization here (can be a class, or whatever) 
Session::createUserSession($user) 
} 
else 
echo 'bad login'; 

logout.php

Session::destroyUserSession(); 

이 디자인은 아마 가장 좋은 방법이 아니다처럼 somehting을 할 수 있지만 당신에게 아이디어를 줄 수 있습니다.

+0

그게 내가 고군분투하는 이유 다.이 문제를 해결할 수있는 방법이 많이 있지만, 갈 방법을 결정할 수는 없다. – Malyo

0

$_SESSION['password']

이 세션에 암호 (일반 텍스트?)를 저장하는 데 필요한 않을 것입니다. 사용자가 로그인 할 수 있는지 확인하고 올바른 암호를 제공하면 "로그인 한 것"보다 더 이상 세션에 저장할 수 없습니다. 편의상 user-id의 사용자 이름을 저장할 수 있습니다.

그러나 암호를 데이터베이스의 암호와 비교 한 후에 암호가 필요하지 않습니다.

관련 문제