0

我有一个关于在我的应用程序后端使用 FeatherJS 设计注册程序的问题。

我面临的问题如下:

我希望用户能够使用他/她的电子邮件和密码注册他的组织/公司。该用户可以被视为组织的管理员。

创建该管理员用户后,我希望该用户能够创建链接到他/她的组织的其他用户。为了确保只有管理员用户可以创建其他用户,我设置了羽毛权限以检查“用户”服务的“之前”挂钩中的“管理员”权限

module.exports = {
  before: {
    all: [ ],
    find: [ authenticate('jwt') ],
    get: [ authenticate('jwt') ],
    create: [ authenticate('jwt'), checkPermissions({
      roles: [ 'admin' ]
    }), hashPassword ],
    update: [ authenticate('jwt'), checkPermissions({
      roles: [ 'admin' ]
    }), hashPassword ],
    patch: [ authenticate('jwt'), checkPermissions({
      roles: [ 'admin' ]
    }), hashPassword ],
    remove: [ authenticate('jwt'), checkPermissions({
      roles: [ 'admin' ]
    }) ]
  },

我现在遇到的问题是我无法注册初始用户,因为 before 挂钩正在请求一个经过身份验证的用户,该用户具有我没有的管理员权限,因为该用户尚未创建。

我可以删除身份验证和权限检查,但随后我的用户服务“不受保护”,任何人都可以使用对服务器的正确 POST 调用来创建用户。

我的问题是:我应该如何设置我的服务和/或挂钩,以便我可以在我的应用程序中注册一个新用户,并且只有经过身份验证的管理员用户才能在应用程序中创建新用户?

提前谢谢了!

4

2 回答 2

0

有几种不同的方法可以解决这个问题。

一种方法是使用https://github.com/feathersjs-ecosystem/feathers-hooks-commoncheckPermissions以是否已经存在用户为条件设置您的钩子iff

另一个将是用于设置初始用户的不同端点-它将具有不同的钩子(例如,确认系统中没有用户而不是权限检查)。

于 2021-02-28T16:54:12.577 回答
0

正如@Joe 所说,有几种方法可以实现这一点。

在我当前的项目中,我正在构建一个多租户应用程序。我区分组织和用户的注册。

第一步是注册一个组织和它的默认用户。组织的默认用户设置为“超级用户”,并且必须在激活之前验证电子邮件/电话(短信)。

验证默认用户后,我会自动在用户表中创建一条记录,将用户设置为“admin”,并使用通用 admin@[org name].com 电子邮件地址。客户端验证 UI 重定向到请求第二个密码的界面。现在,组织的默认用户可以作为 super_admin 登录以更改组织设置,并且可以作为管理员登录,提供对所有站点功能的访问,包括邀请用户。

用户邀请是通过电子邮件设置的。电子邮件中的链接包含一个特殊标记,表示用户已被邀请并可以在指定组织下注册。注册的新用户被设置为访客,直到管理员将他们升级为更高的角色。我使用 user.create 上的钩子来验证所有这些,如果不匹配则返回错误。

我还使用feathers-authentication-management来连接发送电子邮件和管理令牌。

因此,我没有在创建新用户之前强制他们成为管理员,而是使用令牌来确保已被邀请。这些令牌与特定组织相关联。与您的代码示例类似,我有一个 checkInvitation() 函数来保护我的路线,而不是使用角色。

于 2021-03-02T02:19:07.987 回答