登录页面重定向 - 如果没有登录,则无法访问HTML。

问题描述 投票:1回答:1

我有一个基本的HTML登录页面,用户名和密码字段由javascript处理,输入的内容被送回我的Node API进行完整的AD认证。

我有4个更多的HTML网站,只有当用户通过认证后才能访问。在Node应用中运行的身份验证部分工作得很好,但是,我无法处理已经登录的用户的会话。我还想让所有4个HTML网站在登录失败或用户注销时无法访问。

我如何简单地使用HTML和Vanilla JS来处理可访问性部分?

登录.js

var express     = require('express');      
var app         = express();                
var bodyParser  = require('body-parser');
var router      = express.Router();  
var cors        = require('cors');
var ActiveDirectory = require('activedirectory');
const session = require('express-session');


app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 

app.use(session({
    name: 'session.sid',
    secret: 'entersomepasswordhere',
    resave: false,
    saveUninitialized: false
}));

var port = process.env.PORT || 8080; 

app.use('/', router);

router.post('/api/Login1', function(req, res) 
{
    var username = req.body.username;
    var password = req.body.password;

    console.log(username);


    var config = {
        url: 'abc',
        baseDN: 'dc=abc,dc=abc'
    };
    var ad = new ActiveDirectory(config);
    // Authenticate
    ad.authenticate(username, password, function(err, auth) {
        if (err) {
            res.send("Login Failed. Incorrect username or password");
            console.log('ERROR: '+JSON.stringify(err));
            return;
        }
        if (auth) {
            console.log('Authenticated!');
            req.session.loggedin = true;
            res.redirect('/test.html');
        }
        else {
            console.log('Authentication failed!');
            res.send("Login Failed. Incorrect username or password");
        }
    });
});

router.get('/test.html', function(req, res) {
    if (req.session.loggedin == true) //check if user is loggedin, replace with your variables/checks
        res.sendFile('/absolutepath/test.html');
    else
        res.redirect('/Login1');
})

app.use(cors());

app.listen(port);
console.log('Listening at port ' + port);
javascript html node.js express active-directory
1个回答
1
投票

我想我知道问题出在哪里了。核心模块只是为你处理每一个请求,因此每一个http请求都会先在核心中间件中寻找是否有匹配的html文件。你需要将

app.use(cors());

当你定义了你的路由并定义了一个自定义的路由到你的test.html之后。请看下面的例子。

var express = require('express');
var app = express();
var router = express.Router();
var cors = require('cors');

var port = process.env.PORT || 8080; 

//use routes on the localhost:8080 path
app.use('/', router);

//Relevant part:
router.get('/test.html', function(req, res) {
    var loggedin = true; //false if not loggedin
    if (loggedin)
        res.sendFile(__dirname + '/test.html');
    else
        res.redirect('https://www.google.com/');
})

//This needs to be after the routes
app.use(cors());

app.listen(port);
console.log('Listening at port ' + port);

你可以将loggedin设置为false,看看如果用户没有登录会发生什么,如果用户登录了会发生什么。

更新

为了在用户登录时保存,我建议使用express-session模块。https:/expressjs.comenresourcesmiddlewarecookie-session.html。

你可以像下面这样加入。

const session = require('express-session');
app.use(session({
    name: 'session.sid',
    secret: 'entersomepasswordhere',
    resave: false,
    saveUninitialized: false
}));

在认证后,你可以只设置

req.session.loggedin = true;

然后检查是否

req.session.loggedin == true

注意:你可以用任何你喜欢的变量名替换loggedin,你也可以设置多个会话cookie。

在你的情况下,只要在重定向到test.html之前设置req.session.loggedin = true,然后在那里进行检查。

© www.soinside.com 2019 - 2024. All rights reserved.