現在、独自の ACL を作成しています。現在のリソースの名前を取得する方法を知りたいです。
2 に答える
システムでリソース ID/リソースの名前を設定する責任があります。
これを行う 1 つの方法は、 ResourceInterfaceを実装することです。
これには、問題のリソースの一意の識別子を返す getResourceId() という 1 つのメソッドしかありません。
簡単な例は、コントローラー/アクション名に基づいてリソース名/ID を作成するコントローラーを持つことです。明らかに、これはモジュール間で衝突が発生する可能性のある単純な例ですが、単純な例です。
class AclController extends AbstractActionController implements ResourceInterface
{
/**
* Returns the string identifier of the Resource.
* By default we'll just use controller/action
*
* e.g. mvc:index/index
*
* @return string
*/
public function getResourceId()
{
//$request = $this->getRequest();
/* @var $request \Zend\Http\PhpEnvironment\Request */
$routeMatch = $this->getEvent()->getRouteMatch();
/* @var $routeMatch \Zend\Mvc\Router\Http\RouteMatch */
$controller = $routeMatch->getParam('controller', 'noaccess');
$action = $routeMatch->getParam('action', 'noaccess');
return 'mcv:' . $controller . '/' . $action;
}
}
次に、ResourceInterface を実装する任意のオブジェクトを ACL で直接使用できます。
// resource can be any object implementing the interface
$acl->addResource($resource);
Andrew がすでに述べたように、 ACL リソース識別子の作成を担当するのはあなたです。MVC レイヤー自体には、「Acl リソース ID」の概念はありません。
@Samが言ったように、BjyAuthorizeがどのようにそれを行うかをのぞき見したいかもしれません。
Zend Framework 2 の「リソース ID」に最も近い概念は次のとおりです。
- 路線名
- コントローラ名 (コントローラ マネージャ サービス ロケータで定義)
これらは両方とも構成で定義されたものであり、構成からも読み取ることができます。
BjyAuthorizeはリソース名を自動的に読み取りませんが、アプリケーションを不要なアクセスから保護する「ファイアウォール」である、いわゆる「コントローラー ガード」および「ルート ガード」で (アクセスが要求されたときに) とにかく抽象化します。
コントローラー ガードでは、各コントローラー リソース ID は次のいずれかのようになります。
controller/%controller_name%:%action_name
controller/%controller_name%:%http_method
controller/%controller_name%
ルートの構文は次のとおりです。
route/%route_name%
BjyAuthorize は、不足しているリソースに対してのみサイレントに失敗します (をキャッチすることによってZend\Permissions\Acl\Exception\InvalidArgumentException
、ただし、リソースが存在する場合、アンドリューが言ったように、構成によって手動で入力されています.