小案例-后台访问控制

1. 前言

本章要实现后台登陆限制,要求以下html

  • 未登陆前没法访问任何资源,任何安全访问都会被重定向到登陆页面
  • 登录后能够任意访问静态资源

因为没管后台,所以只作了个简易的nodejs尝试实现,核心思想是利用Cookie缓存,具体步骤以下。node



2. cookie+nodejs

步骤:nginx

  1. 首先浏览器登陆,不符合条件的路径所有重定向到登陆页面,这里有个问题,那就是静态页面请求不会被拦截到,其直接定位到对应页面,对此我在全部静态页面设置了一个全局权限校验,不符合权限的所有重定向到登陆页面
  2. 进到登陆页面以后,经过帐号密码验证(此处省略...),后台发送cookie到浏览器保存,登陆页面跳转首页
  3. 首页等其余页面有了未过时的cookie,拿到这个cookie去后台校验权限,权限经过则能够任意访问资源,当cookie过时以后,只能从新登陆获取新的cookie

下面展现后台代码,客户端代码省略...shell

/**
* server
*/
var express = require('express');
var bodyParser = require('./node_modules/body-parser');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var path = require('path');
const { url } = require('inspector');

var app = express();

// 地址解析中间件
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// 引入静态文件
app.use(express.static(path.join(__dirname, 'public')));

//  开放跨域
app.all("*", function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header('Access-Control-Allow-Headers', '*');
    res.header("Access-Control-Allow-Methods", "*");
    res.header("Content-Type", "application/json;charset=utf-8");

    next(); // 执行下一个路由
});

// 配置cookie解析中间件
app.use(cookieParser('sessiontest'));
// 配置默认链接session参数
app.use(session({
    secret: 'sessiontest',
    // 如下是选填参数,可是不填会提示警告 start
    resave: false,
    saveUninitialized: false,
    //  设置connect.sid  
    name: 'caoleiying',
    // 设置生命周期
    cookie: { maxAge: 60000000 },
}));

// 拦截所有请求
app.use(function (req, res, next) {
    if (!req.session.user && req.url != "/login") {   // 若是不存在user
        return res.redirect("./login.html");
    }

    next();
});

// 路由
require('./routes/login.js')(app);

app.listen(8888, function () {
    console.log('端口监听在', 8888);
});
/**
* login.js
*/
module.exports = function (app) {
	// 登陆验证
    app.get('/login', (req, res, next) => {
        var user = {
            name: 'caoleiying',
            age: '22',
            address: 'ad'
        };
        req.session.user = user;
        res.send("设置成功");
    });
	// 权限验证
    app.get('/user', function (req, res, next) {
        var result = (req.session.user) ? "200" : "404";
        res.send(result);
    });
};


3. 番外

以前没接触过这方面知识,我傻了同样想用nginx实现此功能,虽然也能够说实现了,但bug是免不了的,在此贴出代码供各位一观:express

server{
    listen xxxx;
    server_name _*;

    root /root/www/xxxx;
    index index.html;

	# 拦截全部的请求
    location ~ .* {
    	# 校验cookie
        if ( $http_cookie !~ "JSESSIONID=admin123" ) {
        	# 未经过验证,则转发到登陆页面
            rewrite ^  /login.html break;
        }

    }
}


4. 结语

一会儿两个月差很少过去了,有点想念在学校的日子,那里有大大的电脑、有宽宽的跑道、还有美美的仙女!json

不知什么时候能回去,也不知怎么回去,很难回去了跨域


时间: 2020/08/28 10:09浏览器

坐标: 广东省深圳市缓存