使用登录设置身份验证提供程序有很多示例,但我找不到如何为程序包设置身份验证提供程序的示例。
TYPO3 Neos v1.2.x
我有一个包含后端编辑器的包。编辑器应通过控制器进行通信。到目前为止所有工作,但我现在无法访问控制器。如果我查看TYPO3 Neos软件包Settings.yaml,可以选择controllerObjectName
。
Typo3BackendProvider:
provider: 'PersistedUsernamePasswordProvider'
requestPatterns:
controllerObjectName: 'TYPO3\Neos\Controller\.*|TYPO3\Neos\Service\.*|TYPO3\Media\Controller\.*'
entryPoint: 'WebRedirect'
entryPointOptions:
routeValues:
'@package': 'TYPO3.Neos'
'@controller': 'Login'
'@action': 'index'
'@format': 'html'
如果我也将此选项添加到我的控制器中,那么它可以工作:
controllerObjectName: 'TYPO3\Neos\Controller\.*|TYPO3\Neos\Service\.*|TYPO3\Media\Controller\.*|Vendor\Package\Controller\Backend\.*'
但我无法想象,答案是覆盖Neos设置。
所以我尝试使用Typo3BackendProvider
的相同设置添加自己的提供商。
VendorPackageProvider:
provider: 'PersistedUsernamePasswordProvider'
requestPatterns:
controllerObjectName: 'Vendor\Package\Controller\Backend\.*'
entryPoint: 'WebRedirect'
entryPointOptions:
routeValues:
'@package': 'TYPO3.Neos'
'@controller': 'Login'
'@action': 'index'
'@format': 'html'
因为这不起作用我尝试使用tokenClass
并在Typo3BackendProvider
和VendorPackageProvider
上使用相同名称对其进行了定义。不能工作。
日志也没有帮助:
14-12-25 17:52:25 66198 127.0.0.1 INFO Flow Session 52exQd3r1orQA35gTfjQZhhOae4x5SVh contains auth token TYPO3\Flow\Security\Authentication\Token\UsernamePassword for provider VendorPackageProvider. Status: no credentials given
14-12-25 17:52:25 66198 127.0.0.1 INFO Flow Access denied (0 denied, 0 granted, 1 abstained) to method Vendor\Package\Controller\Backend\MyController::indexAction().
14-12-25 17:52:25 66198 127.0.0.1 INFO Flow Redirecting to authentication entry point
routeValues => array (
@package => TYPO3.Neos
@controller => Login
@action => index
@format => html
)
至少我的Policy.yaml:
resources:
methods:
Vendor_Package_BackendAccess: 'method(Vendor\Package\Controller\Backend\MyController->(initalize|index)Action())'
acls:
'TYPO3.Neos:Editor':
methods:
Vendor_Package_BackendAccess: GRANT
答案 0 :(得分:0)
对于其他人在Flow Framework / Neos身份验证提供程序中对此感到疑惑。
可以避免覆盖Neos主程序包设置的提供程序并添加您自己的提供程序,但它不干净并且有严重的缺点。
诀窍是添加另一个具有相同名称但不同大写/小写的提供程序。例如,您有Typo3BackendProvider
,因此您可以使用typo3backendprovider
(全部小写,但您可以根据需要更改一个字母)进行补充。在此提供程序条目中,您可以在控制器上为入口点设置相同的providerclass和requestpattern,并且重叠较小。诀窍的第二部分是将authenticationStrategy
设置为atLeastOneToken
。
所以在你的软件包的Settings.yaml:
中providers:
authenticationStrategy: atLeastOneToken
typo3backendprovider:
provider: 'PersistedUsernamePasswordProvider'
requestPatterns:
controllerObjectName: 'TYPO3\Neos\Controller\LoginController\?.*|Vendor\Package\Controller\Backend\.*'
(您的软件包必须位于PackageStates.php或composer.json中的Neos软件包之后,否则您必须将其置于全局配置中)
现在登录时,Flow身份验证框架将找到两个活动的身份验证提供程序,并使用相同的凭据对两者进行身份验证。当它在Neos后端控制器中时,它将找到一个经过身份验证的令牌,并且在后端控制器中,它还将找到一个经过身份验证的令牌。注销时,即使在技术上只注销了一个令牌或另一个令牌,authenticationmanager也会使用这两个令牌销毁会话。
这个技巧有一个明显的缺点,就是对查询配置并看到两个看起来非常相似的身份验证提供程序的人有点模糊。同样在登录时,哈希时间加倍,因为它被检查两次,因此这不能扩展到组成其后端空间的多个包。最后,atLeastOneToken
策略可能会导致无意的多因素身份验证的意外影响,如果其他提供商在此之前已经进行了身份验证并继续进行身份验证。
鉴于缺点,我会说覆盖默认提供程序的controllerObjectName并不是一件坏事。它确实意味着
Typo3BackendProvider
管理该精确区域的身份验证令牌。它应该在全局Configuration/Settings.yaml
中设置,而不是在包本身中设置,以避免多个包定义controllerObjectName并且只留下最后一个包的问题。在Packages的设置中你也可以设置它,这样如果你忘记了全局配置,它会使正常的后端显然不起作用。