html 重定向到不同的页面,由于不同的角色的用户

tv6aics1  于 2023-06-04  发布在  其他
关注(0)|答案(2)|浏览(245)

我试图做简单的autorization使用数组来模仿数据库。例如,我有两个人的数组:

const users = [{
        info: 'First person',
        login: 'firstPerson',
        password: '11111111',
        role: 'member'
    }, {
        info: 'Second person',
        login: 'secondPerson',
        password: '22222222',
        role: 'admin'
    }
];

他们有不同的角色:member和admin,这意味着他们在输入登录名和密码后会重定向到不同的页面。这是我的表格:

<form action='/categories' method='post'>
        <div class="form-group">
            <input class="form-control item" type="text" name="username"
            maxlength="15" minlength="4" pattern="^[a-zA-Z0-9_.-]*$"
            id="username" required autocomplete="off">
        </div>
        <div class="form-group">
            <input class="form-control item" type="password" name="password"
            minlength="8" id="password" required autocomplete="off">
        </div>
        <div class="form-group text-center">
          <button class="btn btn-primary btn-block save-profile"
          type="submit">Enter</button>
        </div>
    </form>

我正在使用Node.js和Express.js构建一个应用程序。我有个问题您访问的页面不存在!管理员应重定向到页面localhost:3000/choice。我需要拒绝访问此页面,如果用户(成员或管理员)没有登录(错误,如果用户输入页面localhost:3000/类别或localhost:3000/选择之前登录页面localhost:3000)。例如,对于类别,我做了这样的事情(app.js文件):

app.get("/", function(req, res) {
    res.render("autorization"); }); //my form is located in this autorization.ejs

app.get("/categories", function(req, res){   
const login = req.body.username;   
const password = req.body.password;   
 if(!login || !password){
    res.status(401).send("You are not autorized!");   
}   
else{    
    res.render("categories1");  
} 
});

我不能做同样的选择,因为我不能在我的表单中粘贴两个动作(只有action='/categories')。以下是我的帖子请求:

app.post("/categories", function(req, res) {
  let USER = {
    login: req.body.username,
    password: req.body.password,
    role: 'member'
  };
  if (users.some(user => {
    if (req.body.username === user.login && req.body.password === user.password) {
      USER = user;
      return true;
    } else
    {
      return false;
    }
  })) {
    if (USER.role === 'member') {
      res.render("categories1");
    } else {
      res.redirect('/choice');
    }
  } else{
    res.redirect("/alert");
  }
});

我怎么能做这种事呢?

rggaifut

rggaifut1#

假设您希望保持登录表单的原样,并在后端稍微更改一下逻辑,那么您可以

  • 创建一个通用操作路由,即/auth/login
  • 对用户进行身份验证并从数据库中标识其各自的角色(管理员、成员)
  • 验证成功后,根据各自的角色将用户重定向到/category/choice页面

在我看来应该是这样

前端

<form action="/auth/login" method="post">
  <div class="form-group">
    <input
      class="form-control item"
      type="text"
      name="username"
      maxlength="15"
      minlength="4"
      pattern="^[a-zA-Z0-9_.-]*$"
      id="username"
      required
      autocomplete="off"
    />
  </div>
  <div class="form-group">
    <input
      class="form-control item"
      type="password"
      name="password"
      minlength="8"
      id="password"
      required
      autocomplete="off"
    />
  </div>
  <div class="form-group text-center">
    <button class="btn btn-primary btn-block save-profile" type="submit">
      Enter
    </button>
  </div>
</form>

后台

app.post("/auth/login", function(req, res) {
 const login = req.body.username;   
 const password = req.body.password;   
 if(!login || !password){
    return res.status(401).send("You are not autorized!");   
 }

 const user = QueryInDatabase({ username: login, password: password });
 if(!user) {
    return res.status(404).send("User not found")
 }

 let url = '/categories'; /* Keeping this as default redirect route */
 
 /* If role is admin, change the redirect url to /choice */
 if(user.role === 'admin') {
   url = '/choice';
 }
 
 return res.redirect(url)
})

更新:
根据您评论中的问题,您还需要实现适当的路由卫士来验证所需路由中的身份验证和授权。
例如,您希望/choice路由仅对管理员用户可访问,验证这一点的简单中间件是

app.use("*", (req, res, next) => {
  const user = req.session; /* Assuming you are attaching user info in req.session, there are many ways to implement this Example: https://www.passportjs.org */
  switch(req.url) {
    case '/choice': 
         if(user.role !== 'admin') {
           return res.status(403).send('Forbidden');
         }
    .... /* Add other routes as cases */
  }
  next();
})

然后在前端,你可以验证这个状态码,即如果响应。状态=== 403|| response.status === 401,然后将用户重定向到登录页面。
在上面的switch例子中,也可以通过返回res.send('/login_url');
注意:将此中间件放在登录路由(以及所有打开的路由)之后,在本例中,将放在/auth/login之后

jmo0nnb3

jmo0nnb32#

使用正确的身份验证,检查用户名和密码与您的用户数组,您提供如下。您可以使用护照身份验证的电池选项.

const users = [{
        info: 'First person',
        login: 'firstPerson',
        password: '11111111',
        role: 'member'
    }, {
        info: 'Second person',
        login: 'secondPerson',
        password: '22222222',
        role: 'admin'
    }
];

app.get("/categories", function(req, res){   
const login = req.body.username;   
const password = req.body.password;   
if(!login || !password){
    res.status(401).send("You are not autorized!");   
}   
else{ 
   let result = users.find(o => o.username === login); //here you can check for password also.
   if(result.role=='member'){
    res.render("categories1");  
   }else{
     res.render("choice");  
   }    
} 
});

相关问题