【问题标题】:Express application - delegate accessExpress 应用程序 - 委托访问
【发布时间】:2021-05-30 23:37:12
【问题描述】:

我已经创建了一个基本的 node/express 应用程序。

用户可以在 /register 路由上注册,数据发布到 /users/register。用户然后被重定向到登录页面,成功登录后可以访问受保护的路由。

如果您想的话,可以将 MongoDB 作为数据库。

但是,我想实现一个“委托访问”功能。考虑这个例子:

用户注册到网站 ->

const user = {
name: req.body.name,
email: req.body.email,
password: req.body.password,
access: false
}

在我的门户中,我从我的用户集合中获取所有数据。从这里我已经为每个用户设置了一个复选框,以确定是否可以授予用户访问权限。

我很难想出一个体面的解决方案来为多个用户更新它。因为在数据呈现到前端后,我不“知道”用户是谁。

我想要的解决方案是“选中”复选框以分配用户 .access = true ,然后单击更新按钮,然后用户可以登录。

我正在使用通行证对用户进行身份验证,并采用本地策略。

此外,如果任何人有任何使用 smtp 服务的经验,该服务可以与此集成,以便在创建帐户时向用户发送电子邮件,然后向用户发送电子邮件以通知他们已获得访问权限。

非常感谢任何输入。

从 db 呈现用户的前端脚本。

    const container = document.querySelector('.dataSection')
    fetch('/users/all')
        .then(response => response.json())
        .then(data => logUsers(data))
    
    const users = []

    function renderUsers(data) {
        data.forEach((data, index) => {
            users.push(data)
            const userRow = document.createElement('div')
            userRow.className = 'columns user' + data._id 
            userRow.innerHTML =
            `
                    <div class="column">${data.name}</div> 
                    <div class="column is-4">${data.email}</div>
                    <div class="column">${data.company}</div>
                    <div class="column">${data.position}</div>
                `
            if(data.access) {
                userRow.innerHTML += 
                `<div class="column is-1 field">
                    <label class="checkbox" style="text-align: center;">
                        <input class="is-checkradio is-success" type="checkbox" checked>
                    </label>
                </div>`
            } else {
                userRow.innerHTML +=
                `
                <div class="column is-1 field">
                    <label class="checkbox" style="text-align: center;">
                        <input class="is-checkradio is-success" type="checkbox">
                    </label>
                </div>
                `

            }
            container.appendChild(userRow)
        })
    }

【问题讨论】:

  • 您是否希望仅在您提供或将“访问”属性设置为 true 时才向用户提供访问权限?您是否有任何条件让您认为允许用户访问?另外,你从哪里得到这个复选框,你还有其他页面吗?
  • 是的,只有当访问为真时。这背后的想法是,将向用户提供的内容被认为是“敏感的”。所以只有符合条件的用户才能登录。我最初的想法是允许用户注册,当用户注册时,管理员会收到一封电子邮件通知。然后管理员转到 /users,这会呈现一个页面,显示数据库中的所有用户,呈现姓名、电子邮件、公司以及指定 user.access 是否为真的复选框。然后管理员可以勾选复选框并单击更新。这会触发向用户发送一封新电子邮件。
  • 我添加了用于呈现用户的前端脚本。
  • “所以只有符合条件的用户才能登录”,用户有资格访问数据的条件是什么?是管理员随机决定可以访问数据的用户吗?
  • 是的,它基于用户对象中的信息。姓名、公司和职位/角色。

标签: node.js mongodb express web-applications


【解决方案1】:

我认为,这个问题可以有多个答案,但目前根据您提供的输入,这可能是一个很好的选择。它可以有多个步骤。让我一步一步来:

  1. 一旦用户登录新路由,您将获取用户详细信息并将其保存到数据库,访问权限为:false。

  2. 信息保存后,您可以使用NodeMailer 向管理员发送电子邮件。提供可以帮助管理员导航到仪表板的链接。另外,向用户发送一封电子邮件,说明您的请求已注册,管理员将予以考虑。

3)(可选)现在,当您加载仪表板时,您应该创建三个列表:已批准、已拒绝、基于访问的等待(true、false(用户登录时)、未批准)。您应该为访问创建一个下拉列表:批准、拒绝。 (这只是一个建议)

  1. 现在,当您加载仪表板时,您可以创建一个复选框,默认情况下它应该未选中。选中该框后,将向用户发送一封电子邮件(使用 nodemailer),说明您现在可以使用凭据登录。

  2. 如果您有多个用户同时登录您的系统,您实际上可以为仪表板创建一个脚本来检查新用户的条件(可能基于某些业务逻辑),并且应该使用启用它仪表板上的一个按钮(全部批准)。基于业务逻辑的所有用户,应该向他们发送一封电子邮件。

现在,由于您尚未提及批准哪些用户的条件,因此需要人工干预来检查所提供的信息是否正确。

【讨论】:

  • 感谢您的意见,不胜感激! :)
  • 这有什么意义吗:)?
  • 是的,但我实际上是在寻找更具技术性的视角。就像将更改发布给用户的好解决方案一样。每个用户行都是一个 div。所以我的想法是在复选框上设置一个事件侦听器,并根据它们的值用他们的 id/email 更新数据库并相应地访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多