2010-08-13 3 views
1

제목에서 알 수 있듯이 필자는 절차상의 코드를 잘 작성한 PHP/MySQL 응용 프로그램을 상속 받았지만 관리 사용자 로그인은 하나뿐입니다. 클라이언트는 기능을 다른 사용자/역할로 분리하고 궁극적으로 모범 사례 기법으로 응용 프로그램 코드를 업데이트하려고합니다.상속 한 응용 프로그램에서 보안 역할을위한 HTML 등을 어떻게 작성해야합니까?

<input type="text" name="username" value="<?= $username; ?>"> 

는 POST 후 일반에 대해 확인 : 관리자 섹션에서 다른 사람의 이름을 업데이트하는 예를 들어

는 원래 버전은 단순히 (간결을위한 단순화 된 코드) 이름으로 미리 채워진 텍스트 필드를 표시 표현식을 작성하고 데이터베이스에 저장하십시오.

나는 그것이 다른 사용자의 역할 '을 처리 할 수 ​​있도록 기존 코드를 변경하는 방법에 대해 살펴하도록 요청하고 아주 행복하게 user 같은 테이블, role, permission, user-rolerole-permission에와 예제 응용 프로그램을 조롱 한 이것이 실제로 어떻게 작동하는지 설명하십시오. 코드베이스에 권한을 쓰는 방법에 대한 조언이 있다면 궁금합니다. 내 질문은 코드의 큰 덩어리로이 규모를 어떻게하는지 잘

// $access_type can be the result of a function call, an array value, etc. 
switch($access_type){ 
    case 'edit': 
     echo '<input type="text" name="username" value="' . $username . '">'; 
     break; 
    case 'readonly': 
     echo $username; 
     break; 
    case NULL: 
    default: 
     // Don't display anything. 
} 

: 그것은 같은으로 간단하게 템플릿이나 기능에 중 기존 코드를 마무리하는 것이 현명하다? 몇 가지 '대화 형 기능'이 있습니다. 상당량의 HTML을 사용하여 여러 값을 한 번에 POST 할 수 있습니다. & 우리는 효과적으로 각 역할에 대한이 사용자 정의 컨트롤의 별도 버전을 보유 할 것입니다. switch에 각 버전을 붙이면 약간의 코드 냄새 (인라인 코드 또는 별도의 파일로 포함)가 발생합니다 ... 마찬가지로 백엔드에서 POST를 처리 할 스크립트에는 역할에 따라 여러 버전이 있습니다.

나는 이것을 할 수있는 100 가지 방법이 있어야한다는 것을 알고 있지만 다른 사람들은 과거에 무엇을 했습니까? 당신이 통찰력을 가지고 있다면,이 프로젝트에서 볼 수있는 OO가 없으므로 절차 적 스타일로 설명 할 수 있습니까? 감사!

답변

1

당신은 같은 것을 사용할 수 있습니다 다음

interface User { 
    /* stores several roles */ 
    /** 
    * Combines the permissions of the several roles 
    * of the user and returns the result. 
    * @return Permission */ 
    function getPermission($key); 
} 
interface Role { 
    /* stores several permissions */ 
    /* if there's no record of this kind of this 
    * particular permission, return an empty one */ 
    /** @return Permission */ 
    function getPermission($key); 
} 
interface Permission { 
    /** @return Permission */ 
    function combine(array $permissions); 
    /** @return bool */ 
    function canEdit(); 
    function canRead(); 
} 

하고 그냥 수행

/* user factory takes care of creating the instances and 
* wiring them together */ 
$u = UserFactory::loadCurrentUser(); 
if ($u->getPermission('admin_page')->canWrite()) { 
    //... 
} 
+0

안녕 Artefacto, 귀하의 답변을 주셔서 감사합니다. 그러나 if/else 또는 코드 전환에 HTML/JavaScript 청크를 포함시키는 방법과 액세스 유형 'canWrite()'가 충분히 세밀하지 않은 시나리오를 처리하는 방법에 대한 조언을 찾고 있습니다. - canWrite() (예를 들어 'edit', 'readonly'및 잠재적으로 'constrain_to_8_characters', 'lowercase_only') 중 하나를 반환 할 가능성이있는 시나리오를보고있는 반면, 다른 HTML 양식을 사용하고 백엔드 검증. 감사! – Bendos

+0

@Bendos 여분의 권한을 추가하여 추가 세부 사항을 달성 할 수 있습니다. 예를 들어, 'if ($ u-> getPermission ('admin_page_uppercase_stuff ') -> canWrite()) {...}' – Artefacto

+0

@Atrefacto - 허가 여부에 따라 다른 HTML/JavaScript 묶음을 표시하고 싶습니다. 'edit','readonly' 또는'lowercase_only'를 반환했습니다. 예를 들어'switch ($ u-> getPermission ('username') -> getEditability()) {...}'와 비슷하다면 예제가 효과가 있습니까? – Bendos

관련 문제