2009-10-12 5 views
2

클래스의 기능을 특정 개체에만 제한 할 수 있습니까 (C++). 즉, 한 클래스에 10 개의 메소드가 있고이 클래스에 10 개의 객체가 있다고 가정하면 object1을 가질 수 있습니까 & object2 액세스는 3 가지 기능뿐입니다. Object3, object4, object5, object6 액세스 6 기능. 및 나머지 개체가 모든 기능에 액세스합니까?개체에 대한 액세스 제어

일반 사용자가 일부 제한된 기능 만 볼 수있는 액세스 제어 시스템을 구현하려고합니다. Previlaged 사용자는 조금 더 많은 액세스 권한을 가질 수 있으며 관리자는 모든 기능에 액세스 할 수 있습니다.

한 가지 방법은 상속,이 같은 것을 사용하는 것입니다

클래스 PublicFeatures을 { 공개 :

// 여기에 몇 가지 방법을 추가; };

클래스 ProtectedFeatures : 공공 PublicFeatures { 공개 :

// 여기에 좀 더 방법을 추가; };

클래스 AdminFeatures : 공공 ProtectedFeatures { 공개 :

// 여기에 방법의 나머지 부분을 추가; };

이 경우 우리가 원하는 액세스 수준의 종류에 따라 3 가지 클래스 중 하나의 개체를 인스턴스화합니다. 하지만 내가 생각하는 것은 단 하나의 클래스를 갖는 것이고, 어떻게 든 특정 객체에 대한 일부 메소드에 대한 액세스를 제한하는 것입니다.

그런 일을 할 수 있습니까? 아니면 액세스 제어를 구현하기위한 다른 접근 방식을 따라야합니까?

답변

1

내가 아는 한 아니요. 그러나 이것은 Aspect Oriented Programming 연구의 일부입니다. 이 책에서 당신이 필요한 것을 보았습니다 : Aspect Oriented Software Development.

당신이 직면 한 주요 문제는 "누가 전화를 건 사람"인지에 대한 지식 부족입니다. 각 호출자가 객체의 메서드를 호출하여 this을 자체에 대한 인증 형식으로 전달하도록 요청하면 처리 할 수 ​​있습니다. 완벽한 것은 아니지만이 솔루션을 사용하면 각 메소드를 ACL을 수행하는 사전 메서드로 래핑 할 수 있습니다.

또 다른 방법은 구현 클래스를 메소드 측면에서 완전히 비공개로 선언하고 첫 번째 클래스의 친구라고 선언 한 "보디 가드"클래스를 정의하는 것입니다. 보디 가드 클래스는 발신자 (친구 선언으로 인해 권한이있는 유일한 사람) 대신 전화를 처리합니다. 당신은 여전히 ​​인증 문제를 가지고 있고 기본적으로 보디 가드 객체 뒤에 전체 대상 클래스를 래핑합니다.

0

클래스 구성원 액세스 수준은 실제로 사용자 및 보안 제한 사항과 관련이 없습니다. 그것들은 실제로 단지 코딩 구조 일 뿐이며 런타임에는 사용할 수 없습니다. 컴파일러는 코드를 컴파일 할 때 함수를 호출하는 것을 허용하거나 금지합니다. 컴파일하면 프로그램을 실행할 수 있습니다. 어떤 종류의 조건이나 애플리케이션 로직을 추가하는 의미있는 방법은 없습니다.

하지만 내가 생각하는 것은 단 하나의 클래스를 갖고 있으며, 어떻게 든 특정 개체에 대한 일부 메서드에 대한 액세스를 제한합니다.

예, 그렇게해야합니다. 언어는 도움이되지 않지만 직접 메소드에 대한 호출을 보호 할 수 있습니다. 에서처럼 사용자가 관리자가 아닌 경우 관리 방법을 호출하지 마십시오.

if (user.isAdministrator()) { 
    securityLogs.archiveAndDelete(); 
} 
else { 
    throw SecurityException("You can't do that!"); 
} 
+0

이것은 사용자의 문제가 아닙니다. "글로벌 홍보"와 관련하여 "우선 홍보"의 문제입니다. –