小白菜吃兔子 2024-04-23 08:36 采纳率: 72.5%
浏览 38

若依管理系统,登陆后授权使用webstock,不登陆不能访问。代码案例

若依管理系统,登陆后授权使用webstock,不登陆不能访问。代码案例

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-23 08:36
    关注

    引自免费微信小程序:皆我百晓生

    在实现一个类似若依管理系统的Web应用时,我们可以使用Node.js作为后端开发语言,Express框架构建API,MongoDB存储用户数据,并利用JWT(JSON Web Tokens)进行权限验证。这里是一个简单的示例,展示如何实现登录、生成JWT以及保护WebStock资源的路由。

    首先,确保已经安装了所需的依赖项:

    npm install express mongoose jsonwebtoken bcryptjs cors
    

    然后,创建一个名为app.js的文件,开始编写代码:

    const express = require('express');
    const mongoose = require('mongoose');
    const jwt = require('jsonwebtoken');
    const bcrypt = require('bcryptjs');
    const cors = require('cors');
    
    // 连接数据库
    mongoose.connect('mongodb://localhost/your_database_name', {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    
    // 定义User模型
    const UserSchema = new mongoose.Schema({
      username: { type: String, required: true, unique: true },
      password: { type: String, required: true },
    });
    const User = mongoose.model('User', UserSchema);
    
    // 创建 Express 应用
    const app = express();
    app.use(cors());
    app.use(express.json());
    
    // 用户注册
    app.post('/register', async (req, res) => {
      const user = new User(req.body);
      user.password = await bcrypt.hash(user.password, 10);
      try {
        await user.save();
        res.status(201).json({ message: 'User registered successfully' });
      } catch (error) {
        res.status(400).json({ error: error.message });
      }
    });
    
    // 用户登录
    app.post('/login', async (req, res) => {
      const { username, password } = req.body;
      const user = await User.findOne({ username });
    
      if (!user || !(await bcrypt.compare(password, user.password))) {
        return res.status(401).json({ error: 'Invalid credentials' });
      }
    
      const token = jwt.sign({ userId: user._id }, 'your_secret_key', {
        expiresIn: '1h',
      });
      res.json({ token });
    });
    
    // 保护的WebStock资源
    app.get('/webstock', authMiddleware, async (req, res) => {
      // 在这里处理WebStock资源的逻辑
      res.json({ message: 'Welcome to WebStock!' });
    });
    
    // 权限中间件
    function authMiddleware(req, res, next) {
      const token = req.headers.authorization?.split(' ')[1];
    
      if (!token) {
        return res.status(401).json({ error: 'Access denied. No token provided.' });
      }
    
      try {
        const decoded = jwt.verify(token, 'your_secret_key');
        req.userId = decoded.userId;
        next();
      } catch (error) {
        console.error(error);
        res.status(403).json({ error: 'Invalid token.' });
      }
    }
    
    // 启动服务器
    const PORT = process.env.PORT || 3000;
    app.listen(PORT, () => {
      console.log(`Server is running on port ${PORT}`);
    });
    

    这个示例中,我们创建了一个用户模型并定义了注册和登录功能。当用户登录成功后,我们将生成一个JWT并返回给客户端。客户端需要将此令牌保存在本地存储或cookie中,并在后续请求中通过Authorization头传递该令牌。对于受保护的资源(例如/webstock),我们使用authMiddleware中间件检查令牌的有效性。

    注意:这个例子没有包含前端部分,你需要在前端实现表单提交、存储和发送JWT的功能。同时,为了安全起见,请替换 'your_secret_key' 为实际的安全密钥。

    此外,这个示例没有处理错误处理和日志记录,根据实际情况进行添加。在生产环境中,建议使用环境变量来存储敏感信息,比如数据库连接字符串和JWT密钥。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月23日