#概説
honeybaseという名のフレームワークの、route毎のアクセス制限の実装案です。
ホワイトリスト形式でアクセス可能なpath, table, action, role, paramsの組み合わせを定義します
登録されていない組み合わせによるアクセス全て拒否します。
このファイルはphp(laravel)製のhoneybase-server側で読み込まれます。RailsやRevel(go)でも同じように実装します。
全ての/api/v1
以下のAPI(honeybase interface)を用いるrequestにフィルタ処理をかけます。
http通信のリファラを元にpathを判断し、honeybase-clientの通信が持つtable, action, current_user, params情報を元にtable, action, roke, paramsがマッチするか判定します。
基本的にSSL通信を行うので, APIを外部から改ざんして直接叩く事は難しいです。フレームワークにはtinycertという無料のテスト用SSLをとりあえず入れておいて、プロダクション移行時にラピッドSSLなどの安価なSSLくらいを使えばいいかなと。
RDBを用いたWEBサービスの設計の要を「テーブル構造」と「ルーティング」だと捉えました。 これまで仮実装でデータベースに対してアクセス制限を定義していましたが、honeybase-clientを実行できるpathも制限する事が、よくあるWEBサービスのセキュリティモデルにおいて重要だと考えました。
{
"/" : {
"honeybase" : ["auth"],
},
"/choose" : {
"honeybase" : ["uploader"],
"database" : {
"teams" : {
"insert" : {
"role" : "login",
"params" : ["name", "owner_id", "team_cover", "link", "description", "created_at", "updated_at"]
},
"select" : {
"role" : "login",
"params" : ["name", "owner_id", "team_cover", "link", "description", "created_at", "updated_at"]
}
}
}
},
"/admin" : {
"database" : {
"feed" : {
"insert" : {
"role" : "admin",
"params" : ["text", "user_id", "notification_flg", "created_at", "updated_at"]
}
}
}
},
"/my/feed" : {
"database" : {
"feeds" : {
"insert" : {
"role" : "login",
"params" : ["text", "user_id", "notification_flg", "created_at", "updated_at"]
},
"select" : {
"role" : "login",
"params" : ["id", "text", "user_id", "notification_flg", "created_at", "updated_at"]
}
}
}
},
"/my/teams" : {
"database" : {
"teams" : {
"insert" : {
"role" : "login",
"params" : ["name", "owner_id", "team_cover", "link", "description", "created_at", "updated_at"]
},
"select" : {
"role" : "login",
"params" : ["name", "owner_id", "team_cover", "link", "description", "created_at", "updated_at"]
}
}
}
},
"/my/messages" : {
"database" : {
"messages" : {
"insert" : {
"role" : "login",
"params" : ["body", "sender_id", "receiver_id", "read_flag", "created_at", "updated_at"]
},
"select" : {
"role" : "login",
"params" : ["body", "sender_id", "receiver_id", "read_flag", "created_at", "updated_at"]
}
}
}
}
}
アプリの場合:アプリでアカウントシステムを作った事がないので学びが必要だが、基本的に大枠は変わらないと理解しているので、知識の欠陥を埋めて行く。