小案例-後臺訪問控制

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瀏覽器

座標: 廣東省深圳市緩存

相關文章
相關標籤/搜索