iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
Security

從自建漏洞中學習 - 一起填坑吧系列 第 28

Auth 應用程式 - Authorization 授權篇

  • 分享至 

  • xImage
  •  

Auth 應用程式 - Authorization 授權篇

主要實作的內容

管理使用者角色 (User Roles) + Permission

複習

實作 管理使用者角色 (User Roles) + 權限管理

protect function

還記得我們在 AuthController 中建立的 protect function 嗎?

protect function 可以看這邊:
https://ithelp.ithome.com.tw/articles/10336709

之前,我們在 Good practice 中,實作了在需要被保護的 route 中,會在最後要執行動作前,先經過 AuthController 裡 protect function 的控管,像是這樣:

router
  .route('/')
  .get(authController.protect, testController.getAllTests)

在 userModel 更新 userSchema - 建立 role

在實現另外一個控管權限的 middleware 以前,我們需要在 userModel 更新 userSchema:

userSchema:

const userSchema = new mongoose.Schema({
    // 略
    role: {
        type: String,
        enum: ['user', 'admin']
    }
    // 有關 enum 的介紹請看下面的說明
});

說明:

  • enum:

    上面程式碼中的 enum 為一個陣列,它將檢查給定的值是否是數組中的一個。

    如果該值不在陣列中,當嘗試 save() 時,Mongoose 將拋出 ValidationError

restrictTo function

接著,假設我們有一個 route 是 /:id,我們可以透過這個 route 操作 delete,而只有 user role 為 admin 才可以 delete。

那麼,我們就可以在要操作的 function 前,再加上一個 Middleware - authController.restrictTo('admin') 來保護 :

router
    .route('/:id')
    .delete(authController.protect, authController.restrictTo('admin'), testController.deleteTest)

在 authController 中的 restrictTo function:

restrictTo function:

exports.restrictTo = (...roles) => {
    return (res, req, next) => {
       
        // 若 user 並不再指定的角色之中,回傳錯誤
        if(!roleTypes.include(req.user.role)){
            return next(new AppError("You don't have the permission to execute this action.", 403));
        }
        
        // 若有,則繼續
        next();
    }
}

最後,就可以嘗試看看該 route 的 delete 操作是否會受到 admin 的權限限制啦 ~


今日小心得

意外地到最後才感覺有開始串起前面的文章內容,不過我好像現在才掌握到寫文章的訣竅 XD 好像有點太晚...

這次的鐵人賽讓我收穫不少 ~


Reference


上一篇
Auth 應用程式 - Reset passord 篇之 3
下一篇
Auth 應用程式 - 更新 user data 篇
系列文
從自建漏洞中學習 - 一起填坑吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言