一期源碼權限控制邏輯學習

在熟悉一期源碼的過程中,林老師給我們出了好多任務,我領取的任務是“學習一期源碼的權限控制邏輯”。
好了開始學習!
由于從來沒有看過源碼,所以直接上手看這么多的代碼,我的內心其實是拒絕的,看著這么多代碼,都不知道從哪里下手,然后我去和小伙伴們討論了一下,決定從功能開始入手!
從登錄開始看,發現在登錄過程中有一個獲取賬戶的組件

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

但是我無法驗證這樣操作是否正確。。。

一期源碼權限控制邏輯圖

一期源碼權限控制流程圖.jpg
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容