在熟悉一期源码的过程中,林老师给我们出了好多任务,我领取的任务是“学习一期源码的权限控制逻辑”。
好了开始学习!
由于从来没有看过源码,所以直接上手看这么多的代码,我的内心其实是拒绝的,看着这么多代码,都不知道从哪里下手,然后我去和小伙伴们讨论了一下,决定从功能开始入手!
从登录开始看,发现在登录过程中有一个获取账户的组件
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这个数据库,数据库截图如下
确实是role为9,则就是管理员权限,登陆之后,就会有管理中心出现,但是如何设置role这个值的,继续探索!!!
刚才去请教了下林老师,才知道,原来role的值为9是直接写死在数据库中的。。心塞!!!
建立一个新的管理员权限
我刚才尝试了一下直接往数据库里边写一个数据,并且让其role的值为9,建立一个管理员账户,
执行完这句话之后,查看users数据库,可以看到这条数据已经加入到了数据库中
但是我无法验证这样操作是否正确。。。