了解用户管理在 Strapi 中的工作原理以及如何实现它。

作者:Ekekenta Odionyenfe

软件开发中的用户管理是网络安全的一个重要因素。在不断增长的网络犯罪浪潮中,您如何确保正确完成授权和身份验证?不正确的授权和身份验证是您的软件易受攻击的原因。

如果您关心用户的安全和数据合规性法规,那么保护和管理用户访问权限应该是您最关心的问题。这对于使用 Strapi 构建的应用程序没有什么不同。安全意识是软件行业的一个重要课题。由于这些原因,Strapi允许您使用_用户和权限插件_管理最终用户的身份验证,并在管理面板中为管理员用户启动基于角色的访问控制 (RBAC)。

先决条件

您需要以下内容来了解 Strapi 中的用户管理。

  • Node.js和Strapi安装在您的工作环境中。建议至少使用 Node.js 版本 12.x。

  • Strapi 工作原理的基本知识。单击此处阅读文档。

进球

本文的目的是解释用户管理的工作原理以及如何实施用户管理。目标受众将了解 Strapi 中的用户管理如何符合数据合规性法规。

本文将简要探讨 Strapi 中的用户管理、最终用户和管理员用户的用户管理如何在 Strapi 中工作、本地身份验证以及提供商使用 Strapi 进行最终用户身份验证。

最终用户与管理员用户

尽管身份验证和授权都是[身份和访问管理 (IAM)](https://www.coresecurity.com/blog/what-iam-security#:~:text=Identity%20and%20Access%20Management%20(IAM,access%20risks%20within%20a%20business)中的安全过程,但它们是不同的。虽然身份验证尝试识别用户以确保他们是他们所说的身份,但授权允许用户根据他们的角色(他们是谁)访问特定的资源/文档。

将身份验证视为您尝试登录您的 Facebook 帐户。如果您没有提供正确的登录凭据(电子邮件和密码),您将无法访问您的帐户,即使它是您的。只有当您提供正确的登录信息时,您才可以访问您的帐户(经过身份验证)。系统想要确定你就是你所说的那个人。

对于授权,请考虑拥有一个 Facebook 页面。当您登录 Facebook 页面时,您就是管理员,因为您拥有该页面。因此,您可以在页面上发布内容、修改内容,甚至批准来自页面成员(非管理员)的内容。当您的群组中不是管理员的成员尝试批准其他人的内容时,他们会发现自己不能。这是因为他们没有权利这样做;只有管理员可以。

Strapi 中的最终用户就像登录到他们的 Facebook 帐户的用户。他们通过用户和权限插件进行管理,而不是管理员。同时,管理员用户就像 Facebook 页面的所有者。他们是管理员,在管理面板中进行管理。

管理面板与用户和权限插件

虽然用户和权限插件像管理面板一样提供用户管理,但必须知道这两个插件为不同的用户类型提供用户管理。管理面板允许您为有权访问管理面板的用户实施基于角色的访问控制。相比之下,用户和权限插件将使您能够管理最终用户并强制执行身份验证。

为了更好地理解这一点,让我们看一个小型博客公司的例子。这家公司拥有大量的作者、编辑和客户成功总监。要在这家公司组织流程,作者只需要访问他们的帖子,而编辑应该可以访问他们将编辑的所有帖子。客户成功主管应该能够访问和管理与帖子有关的所有功能。因此,可以在管理面板中将作者分配给作者角色,将编辑分配给编辑角色,将客户成功总监分配给超级管理员角色。

[解释的屏幕截图](https://res.cloudinary.com/practicaldev/image/fetch/s--7-6b5t3x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// i.imgur.com/o3PBDwx.png)

默认情况下,管理面板中的角色为 AuthorEditorSuper Admin。默认情况下,创建 Strapi 应用程序的用户被分配了超级管理员角色。您可以通过单击每个角色旁边的编辑按钮来编辑任何角色。

但是,用户和权限插件中的用户管理是不同的。例如,您希望博客中文章的读者在阅读作者撰写的文章后放弃评论。为此,他们需要注册一个帐户。在这里,您可能需要设置用户和权限插件以允许用户(无论是否注册)查看您博客中的文章。不过,您可能不希望未注册(未经身份验证)的用户发表评论,除非他们注册。

[样品](https://res.cloudinary.com/practicaldev/image/fetch/s--xR9Ng4UV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com /URgDWk9.png)

默认情况下,用户和权限插件中的角色是 PublicAuthenticated 角色。默认情况下,注册用户被分配到 Authenticated 角色。

向管理面板添加新用户

随着您的博客不断增长,您将需要雇用更多的作者和编辑。让我们在管理面板中为我们的博客注册一个新用户(作者)。

  • 首先,导航到左侧导航面板中的设置。单击管理面板部分下的用户。您应该看到下图。

[样品](https://res.cloudinary.com/practicaldev/image/fetch/s--z7RRMZCy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com /7x6shcA.png)

  • 接下来,单击蓝色的 Invite New User 按钮。填写用户的详细信息和用户的角色。可以为用户分配多个角色。但是,在这种情况下,我们将用户分配给 Author 角色。此时,您将被要求向用户发送注册令牌,以便他们可以连接。

[示例截图](https://res.cloudinary.com/practicaldev/image/fetch/s--_n7t9yca--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur .com/M1LJ4I7.png)

  • 由于我们的示例应用程序是本地托管的,因此请复制链接并将其粘贴到您的浏览器中。接下来,一旦令牌注册加载,我们将被定向到此页面。

[示例截图](https://res.cloudinary.com/practicaldev/image/fetch/s--b-nrNz8y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i .imgur.com/pReKDUt.png)

  • 填写所需信息,然后单击“开始”按钮。请注意,您刚刚注册的新用户仪表板只有一个媒体库来上传文件。超级管理员可以查看任何用户上传的文件。另外,请注意,当您导航到设置/管理面板/角色时,即http://localhost:1337/admin/settings/roles,您现在拥有一位注册作者。

管理面板中的用户管理说明

本节将创建一个示例博客,其中包含两名作者、两名编辑和一名超级管理员。此示例博客的目标是了解管理面板中的用户管理是如何完成的。

  • 就像我们上一个向管理面板添加新用户的示例一样,再添加一位作者和两位编辑。

  • 导航到其中一位作者登录的选项卡并添加媒体。对我来说,我将为我的一位用户添加一个 Jpeg 文件。为此,请单击导航选项卡中的媒体 库。接下来,单击“上传资产”按钮,系统将提示您上传资产。

[示例截图](https://res.cloudinary.com/practicaldev/image/fetch/s--ckqokMT1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur .com/dI0zc1N.png)

当您导航到超级管理员或编辑者登录的选项卡并导航到 p*lugins/media library*,即http://localhost:1337/admin/plugins/upload时,您应该看到您刚刚上传的文件。但是,只有上传文件的作者才能看到;其他作者无法评价。

就像传统的博客一样,编辑可以替换作者发布的媒体。当您在管理面板中自定义角色时,您可以授予编辑者仅访问分配给他们的作者的帖子的权限。

此外,您可以为您的文章创建新的集合类型,并将角色分配给可以分配它们的用户。

在管理面板中更新和添加新角色

您可以更新每个角色的权限以及添加新角色。默认情况下,我们只有三个角色。但是,我们可以决定向管理面板添加更多角色。

例如,在我们的示例博客应用程序中,我们可能需要一位主编。他不仅可以访问分配给他编辑的帖子,还可以访问板上的所有帖子。为我们的主编添加一个新角色:

1.导航到设置/管理面板/角色,即[http://localhost:1337/admin/settings/roles]

  1. 单击添加新角色按钮。

  2. 填写所需信息,您刚刚创建的新角色将出现在管理面板中。

要更新已经存在的角色,请单击角色旁边的编辑按钮。请搜索您要更新的功能并点击复选框进行检查。

最终用户的用户管理

在本节中,我们将探讨最终用户的不同状态。从公共角色到认证角色,以及如何管理最终用户的权限。

公共角色

公共角色是与没有授权标头的每个请求关联的默认角色。如果您在此角色中允许某些权限,则每个人都将能够访问您选择的路由或端点。

认证角色

如果您在创建时没有为他们提供角色,则默认情况下,每个登录(经过身份验证)的新用户都会获得此角色。在此角色中,您可以定义经过身份验证的用户可以访问的路由。

权限管理

要管理或修改用户角色的权限,请单击仪表板中的角色名称。这将使您能够查看与应用程序中可用的特定路由相关的所有功能。选中或取消选中函数名称以允许您正在编辑的当前角色。

大多数时候,新用户没有被赋予角色。要更新默认角色并向用户分配新角色,请导航到 Advanced settings 选项卡并更新 Default role for authenticated users 选项。请搜索用户并更新他们的角色。

最终用户的本地身份验证

对于 Strapi 最终用户,可以在本地进行身份验证,也可以使用提供者进行身份验证。在本节中,我们将探讨 Strapi 中的本地身份验证是什么。本地身份验证涉及使用您的登录凭据在 Strapi 上进行本地身份验证。在这里,我们将讨论如何在 Strapi 上本地完成注册和身份验证。

注册

在 Strapi 的管理面板中注册非常简单。安装此插件后,您可以通过将用户的数据发布到数据库中来注册Axios的用户,如下例所示。

    //import axios
    import axios from 'axios';

    // Add your own code here to customize or restrict how the public can register new users.

    // make post request with user's credential
    axios
      .post('http://localhost:1337/auth/local/register', {
        username: 'username',
        email: 'email',
        password: 'password',
      })
      .then(response => {
        // If user was registered successfully .....
        console.log('Well done!');
        console.log('User profile', response.data.user);
        console.log('User token', response.data.jwt);
      })
      .catch(error => {
        // If there was an error .......
        console.log('An error occurred:', error.response);
      });

进入全屏模式 退出全屏模式

API 调用中的 identifier 可以是用户的电子邮件或用户名。

令牌使用

当您想根据他们的角色限制哪些用户可以访问某些路由或文档时,您可以使用 JWT 令牌并将 JSON Web 令牌放置在 API 请求的授权标头中以用于受限权限请求。

如果您未在 API 请求中放置授权标头,则该请求将默认承担 public 角色 权限。下面是一个带有授权标头的 API 请求示例。

    //import axios
    import axios from 'axios';

    // place your token here or you can use a .env file.
    const token = 'YOUR_TOKEN_HERE';

    // make post request.
    axios
      .get('http://localhost:1337/posts', {
    // place authorization header here
        headers: {
          Authorization: `Bearer ${token}`,
        },
      })
      .then(response => {
        // If user was registered successfully .....
        console.log('Data: ', response.data);
      })
      .catch(error => {
        // If there was an error .......
        console.log('An error occurred:', error.response);
      });

进入全屏模式 退出全屏模式

上面的示例在 API 请求中放置了一个授权标头以检索帖子。请记住,当用户成功通过身份验证时,将发送用户令牌,如我们的登录示例 console.log('User token', response.data.jwt); 中所示。

如果用户的token与授权时需要的token不对应,则会出现错误,并显示错误码401(未授权)

电子邮件验证

为避免垃圾邮件,您可能需要向注册用户发送电子邮件以验证他们的注册。为此,请在管理仪表板中将 启用电子邮件确认 设置为 ON。确保设置了URL config属性,以便用户可以收到确认链接。有时,需要向用户重新发送确认邮件。为此,请发出如下示例所示的请求。

    // import axios
    import axios from 'axios';

    // Send validation email
    axios
      .post(`http://localhost:1337/auth/send-email-confirmation`, {
        email: 'user@strapi.io', // user's email
      })
      .then(response => {
        // If user was registered successfully .....
        console.log('Your user received an email');
      })
      .catch(error => {
      // If there was an error .......
        console.error('An error occurred:', error.response);
      });

进入全屏模式 退出全屏模式

使用提供商进行最终用户身份验证

对于大多数用户来说,为他们将要使用的每个软件创建新的配置文件变得更加紧张。为了解决这个问题,Strapi 允许用户在提供商的帮助下登录。例如,您可以使用 GitHub 登录您的 Strapi 帐户。您可以在使用 Strapi 构建的应用程序中实现此功能,以便您的用户可以使用 Facebook 或 Google 等提供商登录到他们的应用程序。

[示例屏幕截图](https://res.cloudinary.com/practicaldev/image/fetch/s--Z2Ir3ROE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments .dropbox.com/s_0873AB05CC983F668DCA920B2CBE7FD08CBFF999F37C51D1EC5186AAC30EF736_16142234462_forstrapi.png)

上图解释了当用户登录或注册时提供程序如何与您的应用程序通信。请务必注意,如果您尚未为其分配角色,登录其帐户的用户默认分配给他们的 authenticated 角色,无论他们使用提供程序还是本地方法。

Strapi 允许用户登录或注册以下提供商:

  • GitHub

  • 脸书

  • 谷歌

  • AWS 学习

  • 推特

  • 不和谐

  • 抽搐

  • Instagram

  • VK

  • 领英

  • 认证0

文档中详细说明了如何将每个提供程序合并到您的应用程序中。

结论

本文解释了 Strapi 中的用户管理是如何完成的。我们已经探索了基于角色的访问控制以及它与管理面板的关系。此外,我们还讨论了在本地和使用提供者的情况下使用用户和权限插件进行身份验证。

首先,我们讨论了用户和权限插件与管理面板中的用户管理之间的明显区别。接下来,我们建立一个简单的博客来解释管理面板中的用户角色和权限。我们还研究了在管理面板中自定义角色。

用户管理的用处怎么强调都不为过。了解这是如何工作以更好地优化您的应用程序至关重要。要在管理面板中访问无限角色,请试用Strapi 的企业版。

Logo

更多推荐