在熟悉一期源碼的過程中,林老師給我們出了好多任務,我領取的任務是“學習一期源碼的權限控制邏輯”。
好了開始學習!
由于從來沒有看過源碼,所以直接上手看這么多的代碼,我的內心其實是拒絕的,看著這么多代碼,都不知道從哪里下手,然后我去和小伙伴們討論了一下,決定從功能開始入手!
從登錄開始看,發現在登錄過程中有一個獲取賬戶的組件
get-account.component.jsx
我發現在這個組件中有一個isSuperAdmin的state,組件代碼根據這個state判斷當前用戶是否為管理員,如果isSuperAdmin為true,則加載
var superAdminList = (
<ul className="dropdown-menu" aria-labelledby="dropdownMenu1">
<li><a href="admin.html">管理中心</a></li>
<li><a href="paper-assignment.html">試卷指定</a></li>
<li role="separator" className="divider" />
<li><a onClick={this.logout}>退出</a></li>
</ul>);
若isSuperAdmin為false,則加載
var userList = (
<ul className="dropdown-menu" aria-labelledby="dropdownMenu1">
<li><a href="user-center.html">個人中心</a></li>
<li><a href="dashboard.html">控制臺</a></li>
<li role="separator" className="divider" />
<li><a onClick={this.logout}>退出</a></li>
</ul>);
好了,繼續往下看
這個組件中有一個get-account-actions和get-account-store,在store中若為已登錄用戶,則會往/api/reuse/account發送請求,執行下邊的代碼
onLoadAccount:function() {
request.get('/api/reuse/account')
.set('Content-Type', 'application/json')
.use(errorHandler)
.end((err, res) => {
if (err) {
return;
} else if (res.body.status === constant.httpCode.OK) {
this.trigger({account: res.body.account, isSuperAdmin:res.body.superAdmin,isLoged: true});
} else if(res.body.status === constant.httpCode.ACCEPTED) {
this.trigger({account: '', isLoged: false});
} else {
return;
}
});},
從這里可以看出,發送這個請求之后,獲得的返回值中就包含了該用戶是否為管理員isSuperAdmin:res.body.superAdmin。那好,就去看這個api吧。
/api/reuse/account這個API的源碼如下:
'use strict';
var apiRequest = require('../services/api-request');
var constant = require('../mixin/constant');
function ReuseController () {}
ReuseController.prototype.loadAccount = (req, res, next) => {
if (req.session.user) {
var userId = req.session.user.id;
var url = 'users/' + userId;
apiRequest.get(url, function (err, resp) {
if (err) {
return next(err);
} else if (resp === undefined) {
res.send({
status: constant.httpCode.INTERNAL_SERVER_ERROR
});
} else if (resp.status === constant.httpCode.OK) {
res.send({
status: constant.httpCode.OK,
account: resp.body.email,
superAdmin: resp.body.role === '9'
});
} else if (resp.status === constant.httpCode.NOT_FOUND) {
res.send({
status: constant.httpCode.NOT_FOUND
});
} else {
res.status(constant.httpCode.INTERNAL_SERVER_ERROR);
res.send({
status: constant.httpCode.INTERNAL_SERVER_ERROR
});
}
});
} else {
res.send({status: constant.httpCode.ACCEPTED});
}};
module.exports = ReuseController;
好吧,這個代碼是將發送過來的數據獲取到其id,然后拼接成一個新的url,然后使用apiRequest.get方法發送出去,不過這個里邊我們可以看出,在判斷用戶是否為管理員時使用的是superAdmin: resp.body.role === '9'來判斷的。不過這個‘9’是怎么回事呢?這肯定是apiRequest返回的數據,那就繼續去看apiRequest吧!
從apiRequest里可以看出它使用了superAgent發送了請求
get: function (url, query, callback) {
if (typeof query === 'function') {
callback = query; query = {};
}
superAgent.get(apiServer + url)
.set('Content-Type', 'application/json')
.query(query)
.end(callback);
}
這一塊不知道是什么意思了。。找不到這個請求發出去之后接受這個請求的文件在哪里。。。
然后找小伙伴們討論,看了后臺的Java文件,發現有一個loginResource這個類,這個類里邊可以獲得到用戶的所有信息,然后將用戶的信息作為一個響應,返回!
我做一個猜測,前邊的請求就是這里接受(也許是間接接受)的,然后將這個響應返回給前臺。響應里邊就包含了role,所以前臺就可以判斷該用戶是否為管理員。。。
但是我還是沒有找到如何去設置這個role值的。。。
剛才去終端查看了一下users這個數據庫,數據庫截圖如下
users.png
確實是role為9,則就是管理員權限,登陸之后,就會有管理中心出現,但是如何設置role這個值的,繼續探索?。?!
剛才去請教了下林老師,才知道,原來role的值為9是直接寫死在數據庫中的。。心塞?。?!
建立一個新的管理員權限
我剛才嘗試了一下直接往數據庫里邊寫一個數據,并且讓其role的值為9,建立一個管理員賬戶,
addAdminAccount.png
執行完這句話之后,查看users數據庫,可以看到這條數據已經加入到了數據庫中
usersDatabase.png
但是我無法驗證這樣操作是否正確。。。