Module: Edgar::PermissionMixin

Included in:
EdgarController, EdgarPopupController
Defined in:
app/controllers/edgar/permission_mixin.rb

Overview

permission check before-filters

authorization('require_login' before_filter) should be prior to this.

Class Method Summary (collapse)

Instance Method Summary (collapse)

Class Method Details

+ (Object) included(klass)



5
6
7
8
9
10
# File 'app/controllers/edgar/permission_mixin.rb', line 5

def self.included(klass)
  klass.helper_method(
      :current_user_roles,
      :current_model_permissions
  )
end

Instance Method Details

- (Object) current_model_permissions (private)



33
34
35
36
37
38
39
40
# File 'app/controllers/edgar/permission_mixin.rb', line 33

def current_model_permissions
  @_edgar_current_model_permissions ||= Edgar::ModelPermission.
      joins(user_group: :user_group_users).
      where(
          'model'                         => model_class.to_s,
          'edgar_user_groups.kind'        => Edgar::UserGroup::Kind::ROLE,
          'edgar_user_group_users.user_id'=> current_user.id)
end

- (Object) current_user_roles (private)



26
27
28
29
30
31
# File 'app/controllers/edgar/permission_mixin.rb', line 26

def current_user_roles
  @_edgar_current_user_roles ||= Edgar::UserGroup.joins(:user_group_users).
      where(
          'edgar_user_groups.kind'        => Edgar::UserGroup::Kind::ROLE,
          'edgar_user_group_users.user_id'=> current_user.id)
end

- (Object) require_create_permission (private)



53
54
55
# File 'app/controllers/edgar/permission_mixin.rb', line 53

def require_create_permission
  require_x_permission(Edgar::ModelPermission::FlagsBitset::CREATE)
end

- (Object) require_delete_permission (private)



65
66
67
# File 'app/controllers/edgar/permission_mixin.rb', line 65

def require_delete_permission
  require_x_permission(Edgar::ModelPermission::FlagsBitset::DELETE)
end

- (Object) require_other_permission (private)

fallback to catch public action which permisson is not declared



70
71
72
# File 'app/controllers/edgar/permission_mixin.rb', line 70

def require_other_permission
  respond_to_permission_error
end

- (Object) require_read_permission (private)



57
58
59
# File 'app/controllers/edgar/permission_mixin.rb', line 57

def require_read_permission
  require_x_permission(Edgar::ModelPermission::FlagsBitset::READ)
end

- (Object) require_update_permission (private)



61
62
63
# File 'app/controllers/edgar/permission_mixin.rb', line 61

def require_update_permission
  require_x_permission(Edgar::ModelPermission::FlagsBitset::UPDATE)
end

- (Object) require_x_permission(flag) (private)

common method for all of 'require_*_permission' before_filter



43
44
45
46
47
48
49
50
51
# File 'app/controllers/edgar/permission_mixin.rb', line 43

def require_x_permission(flag)
  if current_user && current_user_roles.any?{|ug| ug.admin?}
    # if role is admin, then ok
  elsif current_user && current_model_permissions.any?{|cp| cp.permitted?(flag)}
    # if enough permission, then ok
  else
    respond_to_permission_error
  end
end

- (Object) respond_to_permission_error (private)



13
14
15
16
17
18
19
20
21
22
23
24
# File 'app/controllers/edgar/permission_mixin.rb', line 13

def respond_to_permission_error
  respond_to do |format|
    format.html {
      flash[:error] = v('permission_no')
      redirect_to main_app.top_path
    }
    format.js {
      flash.now[:error] = v('permission_no')
      render 'message_popup'
    }
  end
end