networkteam/neos-frontendlogin

用于构建具有前端登录的成员区域的Neos包

1.5.0 2024-08-27 05:28 UTC

README

Flowpack.Neos.FrontendLogin启发的Neos前端登录包。它为MemberAreaRootPages提供mixin。该包利用了NodeInterfaceaccessRoles属性。

注意:当前Neos版本neos/neos:7.*neos/neos:8.*似乎与此包兼容,因为已弃用的部分尚未删除。但请注意,未来可能会有破坏性变更。

功能

  • 在页面树中放置一个MemberAreaRootPage,包括成员区域页面本身在内的所有页面都将受到保护
  • 配置登录和登出后的重定向页面
  • 当请求受保护的页面且没有有效登录时,将重定向到配置的登录表单。登录成功后,将重定向到最初请求的页面(引用者)。
  • 可能存在具有不同访问角色的多个成员区域

安装

通过composer安装此包

composer require networkteam/neos-frontendlogin

neos/neos包的兼容性

迁移

此包提供了一个节点迁移,用于将现有的内部accessRoles值复制到常规节点属性。

./flow node:migrate 20210419111000 --confirmation true

节点类型

Networkteam.Neos.FrontendLogin:Mixins.MemberAreaRoot

该mixin Networkteam.Neos.FrontendLogin:Mixins.MemberAreaRoot定义了特定成员区域的根点,其类型为Neos.NodeTypes:Page

通过角色进行身份验证

此包使用neos flow安全框架。有关更多详细信息,您可以查看flow框架文档

提供了两个角色定义

  • Networkteam.Neos.FrontendLogin:MemberArea (抽象的):MemberArea角色的接口。它用于MemberAreaRootPages的访问角色选择。
  • Networkteam.Neos.FrontendLogin:FrontendUser:具体的访问角色实现

您可以通过将它们添加到包的Policy.yaml中来定义自己的前端用户角色。请确保添加Networkteam.Neos.FrontendLogin:MemberArea作为父角色。否则,您将无法在MemberAreaRootPage节点中选择该角色。

当您通过检查器在MemberAreaRootPage上设置访问角色并应用更改时,这些访问角色也将设置在该MemberAreaRootPage下方的所有DocumentNodes上。这确保了所有这些页面只能由具有所选角色的用户访问。

创建前端用户

要创建新的前端用户,您可以使用neos.neos:user:create命令,例如

./flow user:create --authentication-provider "Networkteam.Neos.FrontendLogin:Frontend" --roles "Networkteam.Neos.FrontendLogin:FrontendUser"

或者使用Neos后端中的用户管理模块。

创建成员区域

该包不提供具体实现。它只提供mixin。要创建成员区域,您需要为MemberAreaRootPages定义特定的nodeType,该nodeType实现此包提供的mixin。

定义您的节点类型

您需要为MemberAreaRootPages定义一个节点类型。

一个示例配置可能如下所示

Packages/Application/Your.Package/Configuration/NodeTypes.MemberAreaRootPage.yaml

'Your.Package:MemberAreaRootPage':
  superTypes:
    'Neos.Neos:Document': true
    'Networkteam.Neos.FrontendLogin:Mixins.MemberAreaRoot': true
  ui:
    label: 'Member area'

定义融合对象

对于您定义的节点类型,您需要一个合适的融合对象。一个示例配置可能如下所示

Packages/Application/Your.Package/Resources/Private/Fusion/MemberAreaRootPage.fusion

# MemberAreaRootPage
prototype(Your.Package:MemberAreaRootPage) < prototype(Neos.Neos:Page) {
  
}

提示:通常您会继承自您站点包的默认页面原型。

添加页面和登录表单

现在您可以登录到 Neos 后端并创建一个新的 MemberAreaRootPage。通过选择访问角色并应用更改来定义哪些用户可以访问此会员区域。

接下来,您需要在未受保护的页面上添加一个 登录表单。不要在会员区域或 MemberAreaRootPage 内放置登录表单。否则,您的用户将无法访问登录表单。

现在回到之前创建的 MemberAreaRootPage,选择包含登录表单的页面(登录表单页面)。

此外,您还可以在 MemberAreaRootPage 之下添加更多页面。它们将是受保护的。

添加您自己的 MemberArea 角色

如果您通过 Policy.yaml 定义自己的 MemberArea 角色,请确保将它们作为 parentRoles 添加到 Neos.Neos:AbstractEditor 角色定义中。否则,只有具有您新角色的页面才会在 Neos 后端中可见。这还可能导致发布时的错误。

Policy.yaml

roles:
  'Your.Package:UserWithFrontendAccess':
    parentRoles: [ 'Networkteam.Neos.FrontendLogin:MemberArea' ]

  'Neos.Neos:AbstractEditor':
    parentRoles: [ 'Your.Package:UserWithFrontendAccess' ]

密码重置

为了给您的前端用户提供重置密码的可能性,您可以安装并使用包 Networkteam.Neos.PasswordReset

翻译

要翻译登录错误消息或登录表单标签,为您的包中的每种语言创建一个 xliff 文件,并在 <file> 标签上设置属性 original="Main"product-name="Networkteam.Neos.FrontendLogin"。现在您可以覆盖您喜欢的 Networkteam.Neos.FrontendLogin 包的原始翻译文件中的语言键。

<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
    <file original="Main" product-name="Networkteam.Neos.FrontendLogin" source-language="en" datatype="plaintext">
        <body>
            <trans-unit id="components.atoms.loginform.username" xml:space="preserve">
                <source>Enter your username</source>
            </trans-unit>
            <trans-unit id="components.atoms.loginform.password" xml:space="preserve">
                <source>Enter your password</source>
            </trans-unit>

            <trans-unit id="authentication.onAuthenticationFailure.authenticationFailed" xml:space="preserve">
                <source><![CDATA[<strong>Authentication failed!</strong><br />The login could not be performed with the given credentials.]]></source>
            </trans-unit>
        </body>
    </file>
</xliff>