Nodejs中req.user和req.session.user分不清了

Nodejs中req.user和req.session.user分不清了

到底user是放在req里,还是req.session里,两者有什么区别没? 如果我使用passport的话,默认是哪个?

8 回复

当然可以。让我们详细探讨一下 req.userreq.session.user 的区别,并且通过示例代码来帮助你理解它们的用途。

区别

  1. req.user

    • req.user 通常用于存储当前经过身份验证的用户信息。
    • 它是一个中间件(例如 Passport)在处理认证时设置的对象。
    • 这个对象通常是临时的,只存在于请求生命周期内。
  2. req.session.user

    • req.session.user 是一个持久化的用户会话信息,存储在用户的会话对象中。
    • 它可以在多个请求之间共享,并且通常用于需要跨请求访问用户信息的场景。
    • 会话数据通常存储在服务器端(如内存、数据库或文件系统),并且可以通过会话ID从客户端传递过来。

示例代码

假设我们有一个简单的 Express 应用,并使用 Passport.js 来进行身份验证:

const express = require('express');
const session = require('express-session');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

const app = express();

// 配置会话
app.use(session({
    secret: 'secret',
    resave: false,
    saveUninitialized: false
}));

// 配置 Passport
app.use(passport.initialize());
app.use(passport.session());

// 配置本地策略
passport.use(new LocalStrategy(
    function(username, password, done) {
        // 模拟用户验证
        if (username === 'user' && password === 'password') {
            return done(null, { id: 1, username: 'user' });
        } else {
            return done(null, false, { message: 'Invalid credentials.' });
        }
    }
));

// 保存用户到会话
passport.serializeUser(function(user, done) {
    done(null, user.id);
});

// 从会话中读取用户
passport.deserializeUser(function(id, done) {
    const user = { id: 1, username: 'user' };
    done(null, user);
});

// 登录路由
app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login' }),
    function(req, res) {
        res.send('Logged in!');
    }
);

// 保护路由
app.get('/protected', function(req, res) {
    if (req.isAuthenticated()) {
        res.send(`Hello ${req.user.username}!`);
    } else {
        res.redirect('/login');
    }
});

// 获取会话中的用户
app.get('/session-user', function(req, res) {
    res.send(JSON.stringify(req.session.user));
});

app.listen(3000, () => console.log('Server started on port 3000'));

解释

  • req.user: 在登录后,req.user 存储了当前登录的用户信息(如用户名和用户ID)。
  • req.session.user: 如果你想在会话中持久化用户信息,你可以手动将用户信息添加到 req.session.user 中。

默认行为

当你使用 Passport.js 时,默认情况下 req.user 会被填充为经过身份验证的用户信息。而 req.session.user 需要你自己显式地设置。

希望这些示例代码和解释能帮助你更好地理解 req.userreq.session.user 的区别以及如何使用它们。


用req.user,该user为passport.deserializeUser()回来的

session里的user不应该有太多数据

只用过 req.session.user。 req.user 是怎么来的?

en ,确实是这样的

恩,谢谢

1楼说的是对的。用passport的session处理,默认是返回到req.user里的。 我现在是把current user放在req.session.user里,其他返回的user信息(如show)就放到req.user里了!

req.userreq.session.user 在 Node.js 中有不同的用途和存储位置。理解它们之间的区别可以帮助你更好地管理用户信息。

区别

  1. req.user:

    • 主要用于存储当前经过认证的用户的详细信息。
    • 通常在用户通过身份验证后由中间件(如 Passport)设置。
    • 它存储的是用户对象,包含用户的详细信息(如用户名、ID等)。
    • 它不直接保存在 session 中,但可以通过 session 进行访问。
  2. req.session.user:

    • 可以直接在 session 对象中存储用户信息。
    • 如果你需要将更多用户相关的数据或状态保存在 session 中,可以使用它。
    • 它更灵活,但也可能因为过度使用而增加 session 的大小。

示例代码

假设我们使用 Passport.js 进行身份验证,并且希望了解如何使用 req.userreq.session.user

使用 Passport 设置 req.user

const express = require('express');
const passport = require('passport');

const app = express();

// 假设已经配置了 Passport 中间件和策略
app.use(passport.initialize());
app.use(passport.session());

app.get('/login', (req, res) => {
    // 模拟登录过程
    req.login({ id: 1, username: 'testuser' }, err => {
        if (err) {
            return res.send('Login failed.');
        }
        res.send('User logged in.');
    });
});

app.get('/profile', (req, res) => {
    // req.user 已经被 Passport 设置为登录用户的对象
    res.send(`Hello ${req.user.username}`);
});

使用 req.session.user

如果你需要在 session 中存储更多信息:

app.post('/set-session-user', (req, res) => {
    // 设置 session 中的 user
    req.session.user = { id: 1, username: 'sessionUser' };
    res.send('User added to session.');
});

app.get('/get-session-user', (req, res) => {
    // 从 session 中获取 user
    const user = req.session.user;
    res.send(`Hello ${user.username}`);
});

默认情况

  • 如果使用 Passport.js 进行身份验证,默认情况下,用户信息会被存储在 req.user 中。
  • 如果你需要自定义更多的会话逻辑,则可以使用 req.session.user

通过这些示例代码,你可以看到如何使用 req.userreq.session.user,并根据你的需求选择合适的方式。

回到顶部