Kuroko2でReadOnly権限を追加するgemを作りました

まずKuroko2とは??やKuroko2の素晴らしさには過去書いた下記の記事を見てもらえると 🙏 hatappi.hateblo.jp

Kuroko2に関しては画面上からScriptを定義したり定期実行をしてその実行ログなどが見られる
ただ権限管理のような機能は現状ない。第三者のアクセスに関してはIP制限なりBasic認証で防げば良いと思う

ただ小さなチームで運用していく中ではScriptを追加したり更新したりはしては困るけど実行結果や内容の確認などで閲覧だけ許したい時があるのかなと思います。 僕はありました

なので作りました 👍

github.com

使い方に関してはgem内の README.md に記載されていて
generatorでmigrationファイルを作成して後はKuroko2の設定ファイルにextensionとして今回のgemのconcernを追加するだけで使用できます

Kuroko2には自作したConcernを追加できる

Kuroko2では設定ファイル(config/kuroko2.yml)に下記のようにKuroko2内で使用したいConcernを追加することが出来る

default: &default
  extentions:
    controller:
      - '::Kuroko2ReadOnly::RequestHandler'

仕組みとしてはKuroko2のengine.rbで設定ファイルされたものがincludeされている
今回のgemもこちらの機能を使用している

追加したConcern

今回は下記のようなConcernを追加しました
中身はシンプルでReadOnlyの時はGETリクエスト以外はExceptionを出すだけです

require 'active_support'

module Kuroko2ReadOnly
  module RequestHandler
    extend ::ActiveSupport::Concern
    included do
      before_action :get_request_only
    end

    private

    def get_request_only
      if current_user && current_user.read_only?
        raise ::Kuroko2ReadOnly::AccessDenied unless request.get?
      end
    end
  end
end

おまけ

今回はConcernだけでなく自分以外のユーザーのReadOnlyにするかどうかを設定する画面をMountableEngineで追加しました
viewを作る際にスタイルなどを1からあてるのは骨がおれるのでKuroko2に依存するgemでもあるのでlayoutもKuroko2のものを使用しました

使用自体は下記のように指定するだけでKuroko2ReadOnlyのMountableEngine内のViewでもKuroko2のlayoutが使用できます

class Kuroko2ReadOnly::ApplicationController < ActionController::Base
  layout 'layouts/kuroko2/application'
  ~~~
end

ただこれだけではうまくいかない!!
Kuroko2内のlayoutで定義されている osd_path のようなKuroko2内のroutesで定義されている
もしKuroko2ReadOnlyから使用するのであれば kuroko2.omd_pathのように指定しなければならない
ただ今回はKuroko2のgemのlayoutを使用しているので、指定ができない

なので…

module Kuroko2ReadOnly
  module ApplicationHelper
    def method_missing(method, *args, &block)
      if (method.to_s.end_with?('_path') || method.to_s.end_with?('_url')) && kuroko2.respond_to?(method)
        kuroko2.send(method, *args)
      else
        super
      end
    end
  end
end

このようなものを追加しました これは定義されていないメソッドなどが呼ばれた時にcallされる method_missing をoverrideしているもので、仮に omd_path のようなpathがわたってきてKuroko2ReadOnlyないでは定義されてないがKuroko2側にあるpathの場合はKuroko2でsendして呼び出しそのパス情報を返すようにします

これにより何とか今回使用するGemからKuroko2のlayoutを使用できるようになりました

f:id:hatappi1225:20170306012424p:plain

最後に

使ってなにか不便があればISSUEやTwitterなどでメンションください 🙏