2017年2月3日金曜日

Hubot に簡単な権限チェックの機能を付与してみた

概要

hubot-auth というプラグインがありこれを使うと Hubot で権限管理を実装することができます
権限情報は Redis に保存しており、ユーザやロールを管理しています

わざわざ権限管理だけのために Redis を使うのは億劫だったので、環境変数の値だけで権限チェックできるような仕組みを作ってみたので紹介します

環境

  • Hubot 2.19.0
  • Nodejs 5.9.1
  • npm 3.7.3

権限チェックするコードを実装する

まず権限を持つユーザを管理する環境変数を決めます
今回は「HUBOT_ADMIN_USERS」という名前にします
Hubot スクリプト内で以下のように環境変数を受け取りましょう

ADMINS = process.env.HUBOT_ADMIN_USERS

ユーザはカンマ区切りで複数指定できるようにします
なので、ADMINS に入ったあとは split して配列に格納します

if ADMINS
  admin_list = ADMINS.split ','

こんな感じ admin_list に格納しましょう
環境変数が設定されていない場合は何もしないようにします

次に権限チェックするクラスとメソッドを準備します
今回は以下のように定義しました

  class SimpleAuth
    isAdmin: (username) ->
      admin_list && username in admin_list
  robot.sauth = new SimpleAuth

定義する箇所は「module.exports = (robot) ->」の直下で大丈夫です
あとはこれを必要な箇所で使うだけです
簡単な使い方は以下のような感じです

robot.respond /test auth/i, (res) ->
  username = res.message.user.name
  if robot.sauth.isAdmin username
    res.send "#{username} has admin permisson"
  else
    res.send "#{username} doesn't have admin permisson"

test auth コマンドが実行されたときに自分のユーザ名を取得してその名前が admin_list に入っているか確認することで権限チェックしています
権限がない場合は else 側の処理をします

今回は環境変数でコントロールしているので、ユーザの追加/更新は環境変数の値を変更することで行い、ユーザの削除は unset などで行ってください

最後に

紹介は以上です
わざわざ Redis を立てたくない場合や、ロールなど細かい権限チェックなどが不要な場合はこれで十分だと思います

参考サイト

0 件のコメント:

コメントを投稿