2

There are many examples to setup an authentication provider with an login, but I can't find an example how to setup one for a package.

TYPO3 Neos v1.2.x

I have a package with an editor for the backend. The editor should communicate via controller. So far all works, but I have no access to the controller now. If I have a look at the TYPO3 Neos package Settings.yaml there is an option 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'

If I add to this Option my controller too, then it works:

          controllerObjectName: 'TYPO3\Neos\Controller\.*|TYPO3\Neos\Service\.*|TYPO3\Media\Controller\.*|Vendor\Package\Controller\Backend\.*'

But I can't imagin, that the answer is to overwrite the Neos settings.

So I tried to add an own provider with the same settings of Typo3BackendProvider.

      VendorPackageProvider:
        provider: 'PersistedUsernamePasswordProvider'
        requestPatterns:
          controllerObjectName: 'Vendor\Package\Controller\Backend\.*'
        entryPoint: 'WebRedirect'
        entryPointOptions:
          routeValues:
            '@package':    'TYPO3.Neos'
            '@controller': 'Login'
            '@action':     'index'
            '@format':     'html'

Cause this will not work I tried to use the tokenClass and defined it at Typo3BackendProvider and VendorPackageProvider with the same name. Don't works.

The log are also not helpful:

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
    )

At least my 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
4

1 回答 1

0

对于在 Flow Framework / Neos 身份验证提供程序中对此感到疑惑的任何人。

可以避免覆盖 Neos 主包设置的提供者,添加自己的提供者,但不干净,有严重的缺陷。

诀窍是添加另一个名称相同但大小写不同的提供程序。例如在这里你有Typo3BackendProvider,所以你可以用typo3backendprovider(全部小写,但你可以随意改变一个字母向上/向下)。在此提供程序条目中,您设置了相同的提供程序类和您的请求模式,并在入口点的控制器上略有重叠。技巧的第二部分是将 设置authenticationStrategyatLeastOneToken

所以在你的包的 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 后端控制器中时,它会找到一个经过身份验证的令牌,在您的后端控制器中,它也会找到一个经过身份验证的令牌。注销时,身份验证管理器将使用两个令牌销毁会话,即使它在技术上只注销了一个令牌或另一个。

这个技巧有一个明显的缺点,即对于查询配置并看到两个看起来非常相似的身份验证提供程序的人来说有点模糊。同样在登录时,哈希时间加倍,因为它被检查了两次,所以这不能扩展到将它们的后端空间组合在一起的多个包。最后,atLeastOneToken如果另一个提供商在此之前进行了身份验证并继续进行,则该策略可能会导致无意的多因素身份验证的意外影响。

最好将其设置为全局

考虑到这些缺点,我想说覆盖默认提供者的 controllerObjectName 并不是一件坏事。这实际上意味着 Typo3BackendProvider管理该精确区域的身份验证令牌。它应该设置在全局Configuration/Settings.yaml而不是包本身中,以避免多个包定义 controllerObjectName 并只留下最后一个存在的问题。在 Packages 的设置中,您也可以设置它,这样如果您忘记了全局配置,它会使正常的后端明显无法工作。

于 2018-04-24T19:54:08.590 回答