2010-01-22 5 views
2

나는 누군가가 내가 생각해 낸 질문으로 나를 도울 수 있기를 바랬다.사용자 인증/로그인에서 세션의 역할?

일반 세션 데이터의 저장소를 처리하는 Session 개체가 있고 사용자 자격 증명의 유효성을 검사하는 Authentication 개체도 있습니다.

처음에는 원하는 인증 클래스 이름을 내 Session 개체에 전달한 다음 Authentication 개체의 인스턴스를 만들고 자격 증명의 유효성을 검사하는 로그인 메서드가있었습니다. 이 유효성 검사 결과를 Session 변수에 저장하고 getter를 통해 사용할 수 있도록했습니다. 나중에 사용하기 위해 사용자 데이터도 세션에 저장되었습니다. 이 모든 것 외에도, 세션에서 사용자 데이터를 제거하여 사용자를 로그 아웃하는 로그 아웃 메소드가 있습니다.

제 질문은 사용자가 계정에 로그인 할 때 세션 객체가 어떤 역할을해야합니까?

그리고 다른 방법으로 내가 사용자 세션을 처리하도록 제안 할 수도 있습니다. 바로 지금 내 세션 개체에서 너무 많이 감싸는 것처럼 느낍니다.

+0

나는 비슷한 문제가 발생하고 있는데 내가 대신 – JasonDavis

답변

3

authenticate 메소드를 호출하기 만하면 Auth 내의 논리가 세션 (또는 다른 데이터 저장소)에 적절한 데이터를 저장하고 Auth은이 정보를 검색/취소하는 데 독점적으로 사용해야합니다. 그래서 예를 들어 당신의 코멘트를 형성하여이 될 수 있습니다

class Auth { 
    public static function authenticate($identity, $pass) 
    { 
    // do lookup to match identity/pass if its good then 

    /* assume $auth is an array with the username/email or 
     whatever data you need to store as part of authentication */ 
    Session::set('auth', $auth); 
    return true; 

    // if auth failed then 
    Session::set('auth', array('user'=>'anonymous')); 
    return false; 
    } 

    public function isAuthenticated() 
    { 
    $auth = Session::get('auth'); 
    if(!$auth) 
    { 
     return false; 
    } 

    return (isset($auth['user']) && $auth['user'] !== 'anonymous'); 
    } 
} 

[...] 그것이 지금 내가 같은 느낌의 약자로 너무 많이 내 세션 개체에 을 싸서 얻고 있지만.

그리고 동의합니다. Auth/Acl 개체와 만 상호 작용할 인증/자격 증명을위한 Idelaly. 그런 다음 세션을 상태 저장 저장소로 활용할 것입니다.하지만 세션에 저장되어 있는지주의해야합니다. Auth/Acl 객체를 사용하는 코드는이 사실을 완전히 인식하지 않아야합니다.

//Bad 

if($session->get('authenticated', 'auth')) 
{ 
    // do stuff 
} 


// also bad 

if(isset($_SESSION['authenticated'])) 
{ 
    // do stuff 
} 


//Good 

if($auth->isAuthenticated()) 
{ 
    // do stuff 
} 

// inside $auth class it might look like this 
public function isAuthenticated() 
{ 
    $store = $this->getSotrage(); // assume this returns the $_SESSION['auth'] 
    return isset($store['authenticated']); 
} 
+0

정확하게 이해하고 있습니다. 인증을 직접 한 다음 결과를 얻고 세션에 저장하는 것이 좋습니다. 뭔가가 있습니다. if ($ result = Auth :: authenticate ($ email, $ psswd)) { Session :: set ('user', $ result); } – Andre

+1

세션의 모든 상호 작용이 인증 클래스에 있어야합니다. 세션의 인증 값에 액세스하는 인증 클래스 외부의 사용자는 없습니다. – prodigitalson

+0

당신이 인증 값을 말할 때 사용자 명과 암호 인 인증에 사용되는 자격 증명을 의미하기 위해 설명합니다. – Andre

3

이 세션은 다양한 페이지에서 일종의 상태로 관리하려는 사용자 데이터를 보관하거나 데이터베이스에 접근하지 않고 빠르게 액세스 할 수있는 방법이 필요한 경우 적합한 장소입니다. 세션에서 보안 정보 (re : passwords/etc)를 유지하는 것은 좋지 않지만 사용자 이름, 이름, 전자 메일 주소, 환경 설정 등과 같은 빠른 액세스 정보는 세션에 넣을 좋은 데이터입니다. 그것을 간단하게 유지하려고 노력하십시오.

세션 (또는 관련 쿠키)은 식별을 위해서만 사용해야합니다. 인증에 사용해서는 안됩니다.

인증 개체가 좋은 방법입니다. 민감한 데이터를 보호하기 위해 필요한 모든 기능을 갖추고 있어야하는 한 보안 정보 만 보유해야합니다.

+1

이 동의 파일 기반 세션 또는 데이터베이스 세션의 메모리에 있도록 APC 캐시 또는에서 Memcache에 몇 가지 물건을 저장 고려, 그래서 오전 : 예를 들어

암호 저장은 저장된 사용자 데이터 목록에 없습니다. – Andre