Created
March 22, 2012 16:18
-
-
Save miio/2159291 to your computer and use it in GitHub Desktop.
RailsPermission Snips
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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