Skip to content

Instantly share code, notes, and snippets.

@miio
Created March 22, 2012 16:18
Show Gist options
  • Save miio/2159291 to your computer and use it in GitHub Desktop.
Save miio/2159291 to your computer and use it in GitHub Desktop.
RailsPermission Snips
class HogeController < ApplicationController
before_filter :only => [:destroy] { |c| c.has_perm(current_user, 'hoge.hoge_delete') }
before_filter :only => [:create] { |c| c.has_perm(current_user, 'hoge.hoge_create') }
def create
# todo your logics
end
def destroy
# todo your logics
end
def has_perm(user, perm_arg, *obj)
# todo: miio ここで例外を出さず、ここでは判定のみにする
# 理由としては、ここはパーミッションがあるか問い合わせるだけにしたほうがスマートだと思ったので
# ユーザが存在するか
if user
# ユーザの所属するロールを取得する
user_role = UserRole.where(:user_id => user.id).first
user_role = Role.find(user_role.role_id)
# 指定されたパーミッションがあるか確認する
activity = get_permission_activity(perm_arg)
# ロールとパーミッションがあるとき
if user_role and activity
perm = RolePermission.where(:role_id => user_role.id, :permission_activity_id => activity.id)
if perm.size <= 0
# 対象ロールが該当パーミッションを持っていない時はリジェクトする
render :status => :forbidden, :text => "Forbidden fruit"
return false
else
# 権限があるときはtrueを返す
return true
end
else
# ロール、またはパーミッションが不適切の時はリジェクトする
# TODO: もしかしたら500エラーにしたほうがいいかもしれない
render :status => :forbidden, :text => "Forbidden fruit"
return false
end
else
# ユーザが存在しないときはそのままログイン処理に移る
# TODO: miio omniauthに依存するので例外等で対策を施す
redirect_to user_omniauth_authorize_path(:twitter) unless user_signed_in?
return false
end
end
def get_permission_activity(perm_arg)
permission = get_split_perm_args(perm_arg)
# 指定されたパーミッションがあるか確認する
# TODO: miio ここの書き方もリレーション次第で全然マシになる
# Fixme: miio activityのみで判定されるセキュリティホールがあるので修正すること
role_perm_group = PermissionGroup.where(:name => permission["group"]).first
role_perm_obj = PermissionObject.where(:name => permission["object"]).first
role_perm_act = PermissionActivity.where(:name => permission["activity"]).first
return role_perm_act
end
def get_split_perm_args(perm_arg)
# パーミッションの種類を特定するためにパースする
perms = perm_arg.split(".")
perm_group = perms[0]
perms = perms[1].split("_")
perm_obj = perms[0]
perm_act = perms[1]
return { "group" => perm_group, "object" => perm_obj, "activity" => perm_act }
end
def raise_permission_denies_action
# パーミッションが無いときの処理
end
def require_permission
# パーミッションがあるか無いか
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment