첫 번째 질문
MVC에서 가장 간단한 ACL을 구현하는 방법을 설명해 주시겠습니까?
다음은 Controller에서 Acl을 사용하는 첫 번째 방법입니다.
<?php
class MyController extends Controller {
public function myMethod() {
//It is just abstract code
$acl = new Acl();
$acl->setController('MyController');
$acl->setMethod('myMethod');
$acl->getRole();
if (!$acl->allowed()) die("You're not allowed to do it!");
...
}
}
?>
이것은 매우 나쁜 접근 방식이며 마이너스는 Acl 코드 조각을 각 컨트롤러의 메서드에 추가해야하지만 추가 종속성이 필요하지 않습니다!
다음 접근 방식은 모든 컨트롤러의 메서드를 만들고 컨트롤러의 메서드 private
에 ACL 코드를 추가 __call
하는 것입니다.
<?php
class MyController extends Controller {
private function myMethod() {
...
}
public function __call($name, $params) {
//It is just abstract code
$acl = new Acl();
$acl->setController(__CLASS__);
$acl->setMethod($name);
$acl->getRole();
if (!$acl->allowed()) die("You're not allowed to do it!");
...
}
}
?>
이전 코드보다 낫지 만 주요 단점은 ...
- 모든 컨트롤러의 메서드는 비공개 여야합니다.
- 각 컨트롤러의 __call 메서드에 ACL 코드를 추가해야합니다.
다음 접근법은 Acl 코드를 부모 컨트롤러에 넣는 것이지만 여전히 모든 자식 컨트롤러의 메서드를 비공개로 유지해야합니다.
해결책은 무엇인가? 그리고 모범 사례는 무엇입니까? 메서드 실행을 허용할지 여부를 결정하기 위해 Acl 함수를 어디에서 호출해야합니까?
두 번째 질문
두 번째 질문은 Acl을 사용하여 역할을 얻는 것입니다. 손님, 사용자 및 사용자의 친구가 있다고 가정 해 봅시다. 사용자는 친구 만 볼 수있는 프로필보기에 대한 액세스를 제한했습니다. 모든 참석자가이 사용자의 프로필을 볼 수 없습니다. 그래서 여기에 논리가 있습니다 ..
- 호출되는 메서드가 프로필인지 확인해야합니다.
- 이 프로필의 소유자를 감지해야합니다.
- 시청자가이 프로필의 소유자인지 아닌지 확인해야합니다.
- 이 프로필에 대한 제한 규칙을 읽어야합니다.
- 프로파일 메소드 실행 여부를 결정해야합니다
주요 질문은 프로필 소유자를 감지하는 것입니다. 우리는 모델의 $ model-> getOwner () 메소드를 실행하는 것만으로 프로필의 소유자를 감지 할 수 있지만 Acl은 모델에 대한 액세스 권한이 없습니다. 이것을 어떻게 구현할 수 있습니까?
내 생각이 분명하기를 바랍니다. 내 영어에 대해 죄송합니다.
감사합니다.
if($user->hasFriend($other_user) || $other_user->profileIsPublic()) $other_user->renderProfile()
"이 사용자의 프로필에 액세스 할 수 없습니다."또는 이와 비슷한 것을 표시하지 않겠습니까? 모르겠습니다.