我正在使用ZfcRbac,需要添加一个自定义的重定向策略。我已经在这里阅读过重定向战略文件文档,但我并不完全确定如何为我的用例实现另一种策略:
我的Module.php文件有以下内容:
public function onBootstrap(EventInterface $e)
{
$t = $e->getTarget();
$t->getEventManager()->attach(
$t->getServiceManager()->get('ZfcRbac\View\Strategy\RedirectStrategy')
);
}“我的全球”有以下内容:
<?php
return [
'zfc_rbac' => [
'protection_policy' => \ZfcRbac\Guard\GuardInterface::POLICY_ALLOW,
'guards' => [
'ZfcRbac\Guard\RouteGuard' => [
//ADMIN ACCOUNT GUARDS
'user' => ['admin-master'],
'user/login' => ['guest'],
'user/logout' => ['admin-master', 'merchant-worker', 'guest'],
'user/register' => ['admin-master', 'merchant-admin', 'guest'],
'user/change-password' => ['admin-master', 'merchant-worker'],
'user/forgot-password' => ['guest'],
//CUSTOMER ACCOUNT GUARDS
'customer' => ['customer'],
]
],
'identity_provider' => \RoleBasedUser\Service\AuthenticationService::class,
'role_provider' => [
'ZfcRbac\Role\ObjectRepositoryRoleProvider' => [
'object_manager' => 'doctrine.entitymanager.orm_default',
'class_name' => 'RoleBasedUser\Entity\HierarchicalRole',
'role_name_property' => 'name'
]
],
'redirect_strategy' => [
'redirect_when_connected' => true,
'redirect_to_route_connected' => 'home',
'redirect_to_route_disconnected' => 'user/login',
'append_previous_uri' => true,
'previous_uri_query_key' => 'redirectTo'
],
]
];为了使这个工作,我相信我需要写一个自定义战略,但我不是100%确定如何去做这一点。
发布于 2014-06-23 12:55:00
这其实是很容易解决的,一旦我把我的头脑围绕ZfcRbac。我所做的就是创建自己的RedirectStrategy::MyRedirectStrategy并更新配置全局。
配置全局:要指向的路由和路由的数组。这可以使更广泛的包括多种路线和重定向,但我只需要一个额外的。
'redirect_to_route_disconnected' => [
'routes' => [
'user','other1','other2'
],
'redirect' => 'user/login'
],
'redirect_to_route_connected' => [
'routes' => [
'user','other1','other2'
],
'redirect' => 'user'
],默认设置是为客户页面和替代页面是我的管理。
我在扩展策略中添加了以下检查:
if ($event->getRouteMatch()) {
$routeMatch = $event->getRouteMatch()->getMatchedRouteName();
$redirect_to_route_disconnected = $this->sl->get('config')['zfc_rbac']['redirect_to_route_disconnected'];
$redirect_to_route_connected = $this->sl->get('config')['zfc_rbac']['redirect_to_route_connected'];
} else {
$routeMatch = '';
$redirect_to_route_disconnected = array();
$redirect_to_route_connected = array();
}然后添加一个检查和设置:
if ($this->authenticationService->hasIdentity()) {
if (!$this->options->getRedirectWhenConnected()) {
return;
}
if (in_array($routeMatch,$redirect_to_route_connected['routes'])) {
$this->options->setRedirectToRouteConnected($redirect_to_route_connected['redirect']);
}
$redirectRoute = $this->options->getRedirectToRouteConnected();
} else {
if (in_array($routeMatch,$redirect_to_route_disconnected['routes'])) {
$this->options->setRedirectToRouteDisconnected($redirect_to_route_disconnected['redirect']);
}
$redirectRoute = $this->options->getRedirectToRouteDisconnected();
}我选择将客户页面设置为默认设置,因为我没有问题,因为由于错过了路由,所以管理员被定向到了客户页面,相反,check.The会使客户感到困惑。
https://stackoverflow.com/questions/24352585
复制相似问题