2013-01-09 1 views
1

잠시 후이 문제에 대해 다소 혼란 스럽습니다.OO의 사용자 권한 디자인 : 임베디드 메소드 대 프로그램 실행 제어

말하자면 관리자가 대학에 신규 학생을 등록 할 수있는 유일한 사용자 인 OO 시스템을 설계해야합니다. 이제는 (분명히) 다른 사용자가 시스템에 있습니다. 사용자가 관리자 인 경우에만 이러한 권한을 제어해야합니까?

은 비록 두 가능성을 가지고 :

if(user_type() == 'a') register_student(); // a type means an admin user 

else cout << "Access denied"; 

... 

답변

3

이 있습니다 Student 클래스, 아니면 그냥 같은 프로그램 실행에 새로운 학생들의 등록을 제어와 통신 Admin 클래스 내부의 함수로 이러한 역할을 내장 OO 인이 작업을 수행하는 몇 가지 방법은 다음과 같습니다.

if(user->has_permission(REGISTER_STUDENT)) { 
    register_student(); 
} 

학생 인스턴스를 등록 할 권한이 있는지 묻는 중입니다. 다른 방법 :

if(user->in_role(ROLE_ADMIN)) { 
    register_student(); 
} 

코드와 관련된 문제점은 관리자 역할이 결정되는 방법에 대한 내부 세부 정보를 제공한다는 것입니다. 편지 a는 결국 새로운 유지 자에 대한 상황에 대해 상황을 잃어 버리고 무의미 해집니다. 반면에 상수 인 ROLE_ADMIN/REGISTER_STUDENT은 추가 의견없이 코드의 의도를 분명히합니다.

등록을 수행하는 것은 실제로 User 클래스 또는 Admin 클래스의 책임이 아닙니다. 그것은 Student에 대한 감각이 자신을 등록 할 수 있도록 않습니다

if(user->in_role(ROLE_ADMIN)) { 
    student->register(); 
} 

나는 Controller 클래스에서 보여야하는데이 코드를. Controller 클래스를 결정하기 위해 사용자 인터페이스 객체를 검토 할 수있을 것입니다 :

  • 현재 선택된 어떤 학생 사용자가 사용자가
에 어떤 역할 인터페이스
  • 에서 선택한 항목 옵션
  • 는 C 동안

    if(user->is_admin()) { 
        student->register(); 
    } 
    

    :

    다음을 구현할 수 ODE는 다음과 같은 가능성을 열어두고 할 수 있습니다 덜 유연 매우 분명하다

    if(controller->can_execute(user, action)) { 
        action->execute(); 
    } 
    else { 
        controller->execute_error(user, action); 
    } 
    

    이 동적 조치에 할당 할 수있는 역할에 훨씬 더 유연한 시스템을 제공한다. 예를 들어 student->register() 메서드를 ROLE_ADMIN에 매핑 할 수 있습니다. 이렇게하면 전체 응용 프로그램의 모든 보안 제약 사항을 단일 위치에 유지할 수 있으므로 유지 관리가 크게 단순 해집니다.

    또한 더 단순화 될 수 있습니다

    controller->execute(user, action); 
    

    은 그런 방법이 유사 할 것이다 실행 : 권한 오류가 표시되는 방법에 대한

    void execute(User user, Action action) { 
        if(can_execute(user, action)) { 
        action->execute(); 
        } 
        else { 
        error(user, action); 
        } 
    } 
    
    bool can_execute(User user, Action action) { 
        return user->is_in_role(action->get_role()); 
    } 
    

    구현 세부 사항 (대화 상자의 대 cout)한다 지금 추상화. 다음 문자열로 인코딩 된

    "User registration is restricted to the administrator role." 
    

    : 또한, 오류 메시지는 다음과 같은보다 포괄적 일 수있다

    "%s is restricted to the %s role." 
    

    컨트롤러 클래스는 자동으로 %s를 대체 할 수 있습니다.

    관련 문제