2013-11-27 4 views
2

나는이 레벨 내에서 다양한 수준의 사용자 권한과 개별 권한의 관리를 포함하는 웹 응용 프로그램 인벤토리 시스템을 개발 중입니다. 따라서 대부분의 관리자는 모든 권한을 갖지만 관리자를 만들어 특정 권한을 제거 할 수 있습니다. 궁극적으로 이러한 사용 권한은 MySQL 데이터베이스 내에 비트 문자열로 저장됩니다. 여기서 1은 사용 권한을, 0은 사용 권한이 없음을 의미합니다. 나는 보안을 희생시키지 않으면 서 시스템을보다 효율적으로 만드는 작업을하고있다. 사용자가 작업을 완료하려고 할 때마다 데이터베이스 검색을 실행하고 권한을 확인하는 대신, PHP 사용 권한을 서버에서 가져온 시간 스탬프와 함께 PHP 세션 변수 내에서 사용 권한을 캐시하고 싶습니다.PHP 퍼미션의 글로벌 타임 스탬프

$query_getUser = $this->User->prepare("SELECT * FROM users WHERE Email = ?"); 
$query_getUser->bindParam(1, $Email); 
$query_getUser->execute(); 
$result = $query_getUser->fetchAll(PDO::FETCH_ASSOC); 
$date = new DateTime(); 

session_start();       
$_SESSION['Email'] = $Email;       
$_SESSION['Password'] = $Password;      
$_SESSION['Timestamp']= $date->getTimestamp();  
$_SESSION['Permissions']= $result['Permissions']; 

내가 만난 주요한 문제는 전역 변수를 저장할 위치입니다. 가장 안전한 장소는 무엇입니까? 본질적으로, 나는 현재의 캐시 날짜를 O (1) 시간에 비교할 수있는 어딘가에 저장하려고합니다.

또한이 방법으로 사용 권한을 구현할 때 주된 관심사가 있습니까? 사용자 권한이 자주 변경되지 않고 새로운 사용자가 아직 시스템에 추가 될 때까지 끌어 오기 권한이없는 경우 (create_user가 캐시 업데이트를 발생시키지 않지만 modify_user는 수행하지 않음) 합리적인 접근 방법입니까?

+0

+1 구조화 된 질문 및 prepared statements. – Jonast92

답변

0

정상적인 전역 변수를 갖는 복잡한 응용 프로그램의 경우 상당히 엉망입니다. 내가하고 싶은 것은 검색/저장 메커니즘을 클래스에 랩핑하고 클래스가 모든 작업을 수행하도록하는 것입니다. 이 같은

뭔가 : 다음

class Auth { 
    public static function has_privilege($privilege) { 
     $privileges = static::_get_privileges(); 
     if(in_array($privilege, $privileges)) { 
      return true; 
     } 
     return false; 
    } 
    protected static function _get_privileges() { 
     $from_session = $_SESSION['Privileges']; 
     $last_update = $_SESSION['Timestamp']; 
     if(time() - $last_update > 60*60*24) { // One day 
      // Fetch them from the DB 
     } 
     else { 
      return $from_session; 
     } 
    } 
} 

그리고이 같은 권한을 확인하십시오

if(\Auth::has_privilege('do_something')) { 
    echo 'You can do something.'; 
} else { 
    echo 'You cannot do something.'; 
} 

User 클래스의 일환으로이 모든 것을 가지고 더 나은 것, 그러나 이것은 당신에게 제공한다을 아이디어.

이제 보안 측면에서 시스템에 따라 다릅니다. 기본 PHP 세션 기능은 세션 정보를 /tmp 디렉토리의 파일에 저장하므로 해당 디렉토리가 안전하고 세션이 안전해야합니다. 가장 걱정해야 할 사항은 세션 하이재킹이지만 권한 저장 문제와는 별개입니다.

+0

이것이 올바르게 이해되면 기본적으로 사용자의 권한에 대한 시간 제한이 설정됩니다. 내가 뭘 하려는지는 권한 변경이있을 때 자동으로 사용자 권한을 제한하는 것입니다. 따라서 예를 들어 사용자가 관리자에 의한 권한을 제거하고 그 전에 로그인 한 경우 해당 변경 사항은 다음 번에 권한이 필요한 작업을 시도 할 때 적용됩니다. – Don

+0

그러면 다른 저장 메커니즘을 원한다면 DB를 매번 쿼리하지 않고 세션에 저장하는 방법이 없습니다. 권한 때마다 데이터베이스를 쿼리하는 것이 잘못된 이유는 무엇입니까? – jraede

+0

모든 쿼리는 해당 작업을 수행 할 수 있는지 확인하기 위해 해당 사용자의 사용 권한에 대해 데이터베이스를 검색해야합니다. 검색에는 그다지 오래 걸리지는 않지만, 특히 데이터베이스에 수천 명의 사용자가있을 수 있으며, 동시에 한 번에 수백 개의 시스템에 액세스 할 수있는 경우에는 시간이 걸립니다. 최종 목표는 효율적이고 합리적으로 안전한 시스템입니다 (15-30 분의 비활성 시간 초과를 제외하고 누군가가 로그인하여 컴퓨터에서 벗어날 경우 많은 작업이 수행되지 않습니다). – Don