2011-12-04 2 views
5

좋아, 난 그냥 내 능력을 향상시키기 위해 PHP에서 더 느슨하게 결합 된 클래스 등을 만드는 데 더 노력하고 있습니다. 내 컴퓨터에 로컬 테스트 데이터베이스가 있고 사용자 테이블에 "role"이라는 열이 있습니다. 사용자에게 권한을 부여하는 일반적인 함수 인 함수를 작성하려고 시도하고 있으므로 사용자가 수행하려고하는 특정 작업에 의존하지 않습니다. 다차원 배열에 사용 권한을 저장 PHP

사용자는 내가 데이터베이스를 조회 할 등 새로운 포럼 주제를 만들고으로 뭔가를 시도

"역할은"특정 값, 다음과 같은 다차원 배열에 저장 권한 인 경우

$permissions = array(
    'forums' => array("create", "delete", "edit", "lock"), 
    'users' => array("edit", "lock") 
); 

그런 다음 사용자가 isset ($ var)을 검사하여 양식을 게시 한 후 모든 PHP 파일의 맨 위에 다음을 입력하지 않고 특정 사용 권한에 대해 해당 배열을 검색 할 수 있기를 원합니다. 사용자가 사용자를 편집하려고하면 그래서 가능하면 클래스의 방법을 통해 다음과 같은 일을 할 수 있도록하려면

if (Class::get_permissions($userID),array($permissionType=>$permission))) { 
    // do query 
} else { 
    // return error message 
} 

것이다 체크 기능을 느슨하게 연결된 권한이 할 수있는 좋은 방법이 될 것입니다 방법 이런 식으로 할 수 있을까요? 정확히 이렇게 배치 할 필요는 없지만 느슨하게 결합하여 재사용 할 수 있고 특정 작업에 묶이지 않아도됩니다. 하지만 재사용을 위해 "admin", "user"등의 권한을 대신 사용할 수 있기를 원하며 따라서 내 옵션을 제한하지 않습니다. 때문에 지금은 내 PHP 스크립트 파일의 상단에 같은 코드 잔뜩 있습니다.

if (Class::get_permissions($userID) == "admin") { 
    // allow query 
} else { 
    // return error 
} 

내가 입력 한 내용을 받아 들여 주셔서 감사합니다.

+0

젠드의 ACL 섹션은 acl의 작동 방식에 대한 소개를 잘 받았습니다. http://framework.zend.com/manual/en/zend.acl.introduction.html –

답변

3

귀하의 질문은 다소 모호하지만 최선을 다하겠습니다. 권한을 배열 $permissions에 저장한다고하셨습니다. 내 코드는 매우 일반적이며,

Class::setPermissions($permissions); 
// ... 
if (Class::hasPermissions($page, $action)) { 
    // user has permission 
} 

참고 것을 유지해야한다 : 당신은 DB에서 사용자의 권한을 읽을 때 그 논리를 사용

public static $permissions = array(); 

public static function setPermissions($perms) 
{ 
    if (!is_array($perms)) { 
     throw new Exception('$perms must be an array.'); 
    } 
    self::$permissions = $perms; 
} 

public static function hasPermission($section, $action) 
{ 
    if (array_key_exists($section, self::$permissions) 
     && in_array($action, self::$permissions[$section]) 
    ) { 
     return true; 
    } 

    return false; 
} 

, 다음, 그래서 같은 Class::$permissions 정적 VAR을 설정 내가 더 많은 정보를 얻을 때까지. 지금은 사용 권한 배열이 페이지 섹션을 색인으로 사용하고 배열이 사용자가 액세스 할 수있는 해당 페이지 섹션 내의 작업 목록이라고 가정합니다. 따라서 $page"forums"과 같이 설정되어 있고 사용자가 현재 편집을 수행하려고하고 있으므로 ($action = 'edit') Class::hasPermission() 함수는 true를 반환합니다.

+0

입력 해 주셔서 감사합니다. 한 가지 질문이 있습니다. 이 방법은 $ _SESSION [] 변수에 배열을 저장할 필요가있는 것처럼 보입니다. 이것이 내가해야하는 방법인가? 나는 $ _SESSION 변수에 넣지 말아야 할 것을 혼동했다. 감사! – vol4life27

2

의견에 문자가 부족합니다 ... 그러나 이것은 귀하의 의견입니다.

@corey 정적 개체 대신 @corey, 사용자 세션에서 내 권한을 설정하는 함수를 포함합니다. 사용자가 로그인 할 때마다 호출되는 LoginCommand 클래스의 일부입니다.

사용 권한은보기에서보기로 저장되므로 계속 쿼리 할 필요가 없습니다. 대부분의 일들에 대한 권한 검사는 사용자가 로그인 할 때만 발생합니다. 그러나 특정 민감한 일을 다시 확인하기 위해 다른 쿼리를 실행합니다. 사용자에게 활성 세션이있는 동안 사용자 권한이 변경되면 이러한 변경 사항이 사용자에게 푸시되지 않는다는 단점이 있습니다.

좋은 세션 보안을 수행하는 것을 잊지 마십시오. PHP Session Security

세션 크기에 데이터를 저장하지 않는 유일한 이유는 세션이 너무 커졌기 때문입니다. 하지만 세션이 메가 바이트가 아니라면 걱정할 필요가 없습니다.

+0

그래서 각 사용자의 세션 변수가 메가 바이트보다 작 으면? 따라서 실제로 이름, 성, 사용자 이름, 사용자 ID 및 전자 메일과 같은 사용자 데이터의 약 6 개 필드를 $ _SESSION 변수에 User 객체로 저장하려는 경우 확장성에 관한 한 완벽하게 확인 할 수 있습니까? – vol4life27

+0

예. 세션 크기의 근사값을 얻으려면 다음을 사용하십시오. $ size_of_session_estimate = strlen (serialize ($ _SESSION)); 세션이 너무 커지면 세션 저장 경로 등을 동적으로 설정하는 방법이 있습니다. 다른 사람의 세션이 너무 커 보이지는 않았지만 페이스 북, 아마존 등에서 일한 적이 없습니다 ... 또한 내 대답을 투표하십시오. :) – phpmeh