strongbolt 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +33 -0
  3. data/.gitignore +18 -0
  4. data/.rspec +1 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/Gemfile +4 -0
  8. data/Gemfile.lock +130 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +182 -0
  11. data/Rakefile +1 -0
  12. data/app/assets/javascripts/strongbolt.js +1 -0
  13. data/app/assets/javascripts/strongbolt/role-capabilities.js +80 -0
  14. data/app/controllers/strongbolt/capabilities_controller.rb +77 -0
  15. data/app/controllers/strongbolt/roles_controller.rb +92 -0
  16. data/app/controllers/strongbolt/security_controller.rb +8 -0
  17. data/app/controllers/strongbolt/user_groups_controller.rb +76 -0
  18. data/app/controllers/strongbolt/user_groups_users_controller.rb +35 -0
  19. data/app/controllers/strongbolt_controller.rb +2 -0
  20. data/app/views/strongbolt/_menu.html.erb +13 -0
  21. data/app/views/strongbolt/capabilities/index.html.erb +53 -0
  22. data/app/views/strongbolt/capabilities/show.html.erb +53 -0
  23. data/app/views/strongbolt/roles/_capabilities.html.erb +47 -0
  24. data/app/views/strongbolt/roles/_capability.html.erb +21 -0
  25. data/app/views/strongbolt/roles/_form.html.erb +12 -0
  26. data/app/views/strongbolt/roles/edit.html.erb +14 -0
  27. data/app/views/strongbolt/roles/index.html.erb +54 -0
  28. data/app/views/strongbolt/roles/new.html.erb +11 -0
  29. data/app/views/strongbolt/roles/show.html.erb +52 -0
  30. data/app/views/strongbolt/user_groups/_form.html.erb +12 -0
  31. data/app/views/strongbolt/user_groups/edit.html.erb +14 -0
  32. data/app/views/strongbolt/user_groups/index.html.erb +46 -0
  33. data/app/views/strongbolt/user_groups/new.html.erb +13 -0
  34. data/app/views/strongbolt/user_groups/show.html.erb +88 -0
  35. data/lib/generators/strongbolt/fix_generator.rb +23 -0
  36. data/lib/generators/strongbolt/indexes_generator.rb +19 -0
  37. data/lib/generators/strongbolt/install_generator.rb +29 -0
  38. data/lib/generators/strongbolt/templates/fix.rb +5 -0
  39. data/lib/generators/strongbolt/templates/indexes.rb +21 -0
  40. data/lib/generators/strongbolt/templates/migration.rb +73 -0
  41. data/lib/generators/strongbolt/templates/strongbolt.rb +45 -0
  42. data/lib/generators/strongbolt/views_generator.rb +26 -0
  43. data/lib/strongbolt.rb +219 -0
  44. data/lib/strongbolt/base.rb +7 -0
  45. data/lib/strongbolt/bolted.rb +125 -0
  46. data/lib/strongbolt/bolted_controller.rb +297 -0
  47. data/lib/strongbolt/capabilities_role.rb +15 -0
  48. data/lib/strongbolt/capability.rb +165 -0
  49. data/lib/strongbolt/configuration.rb +111 -0
  50. data/lib/strongbolt/controllers/url_helpers.rb +37 -0
  51. data/lib/strongbolt/engine.rb +44 -0
  52. data/lib/strongbolt/errors.rb +38 -0
  53. data/lib/strongbolt/generators/migration.rb +35 -0
  54. data/lib/strongbolt/helpers.rb +18 -0
  55. data/lib/strongbolt/rails/routes.rb +20 -0
  56. data/lib/strongbolt/role.rb +46 -0
  57. data/lib/strongbolt/roles_user_group.rb +15 -0
  58. data/lib/strongbolt/rspec.rb +29 -0
  59. data/lib/strongbolt/rspec/user.rb +90 -0
  60. data/lib/strongbolt/tenantable.rb +304 -0
  61. data/lib/strongbolt/user_abilities.rb +292 -0
  62. data/lib/strongbolt/user_group.rb +24 -0
  63. data/lib/strongbolt/user_groups_user.rb +16 -0
  64. data/lib/strongbolt/users_tenant.rb +12 -0
  65. data/lib/strongbolt/version.rb +3 -0
  66. data/lib/tasks/strongbolt_tasks.rake +29 -0
  67. data/spec/controllers/strongbolt/capabilities_controller_spec.rb +254 -0
  68. data/spec/controllers/strongbolt/roles_controller_spec.rb +228 -0
  69. data/spec/controllers/strongbolt/user_groups_controller_spec.rb +216 -0
  70. data/spec/controllers/strongbolt/user_groups_users_controller_spec.rb +69 -0
  71. data/spec/controllers/without_authorization_controller_spec.rb +20 -0
  72. data/spec/dummy/.rspec +2 -0
  73. data/spec/dummy/README.rdoc +28 -0
  74. data/spec/dummy/Rakefile +6 -0
  75. data/spec/dummy/app/assets/images/.keep +0 -0
  76. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  77. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  78. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  79. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  80. data/spec/dummy/app/controllers/posts_controller.rb +18 -0
  81. data/spec/dummy/app/controllers/test_controller.rb +3 -0
  82. data/spec/dummy/app/controllers/without_authorization_controller.rb +5 -0
  83. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  84. data/spec/dummy/app/mailers/.keep +0 -0
  85. data/spec/dummy/app/models/.keep +0 -0
  86. data/spec/dummy/app/models/concerns/.keep +0 -0
  87. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  88. data/spec/dummy/bin/bundle +3 -0
  89. data/spec/dummy/bin/rails +4 -0
  90. data/spec/dummy/bin/rake +4 -0
  91. data/spec/dummy/config.ru +4 -0
  92. data/spec/dummy/config/application.rb +29 -0
  93. data/spec/dummy/config/boot.rb +5 -0
  94. data/spec/dummy/config/database.yml +25 -0
  95. data/spec/dummy/config/environment.rb +5 -0
  96. data/spec/dummy/config/environments/development.rb +37 -0
  97. data/spec/dummy/config/environments/production.rb +78 -0
  98. data/spec/dummy/config/environments/test.rb +39 -0
  99. data/spec/dummy/config/initializers/assets.rb +8 -0
  100. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  101. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  102. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  103. data/spec/dummy/config/initializers/inflections.rb +16 -0
  104. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  105. data/spec/dummy/config/initializers/session_store.rb +3 -0
  106. data/spec/dummy/config/initializers/strongbolt.rb +32 -0
  107. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  108. data/spec/dummy/config/locales/en.yml +23 -0
  109. data/spec/dummy/config/routes.rb +12 -0
  110. data/spec/dummy/config/secrets.yml +22 -0
  111. data/spec/dummy/db/development.sqlite3 +0 -0
  112. data/spec/dummy/db/migrate/20150630212236_create_strongbolt_tables.rb +54 -0
  113. data/spec/dummy/db/migrate/20150630212251_create_strongbolt_tables_indexes.rb +21 -0
  114. data/spec/dummy/db/schema.rb +84 -0
  115. data/spec/dummy/db/test.sqlite3 +0 -0
  116. data/spec/dummy/lib/assets/.keep +0 -0
  117. data/spec/dummy/public/404.html +67 -0
  118. data/spec/dummy/public/422.html +67 -0
  119. data/spec/dummy/public/500.html +66 -0
  120. data/spec/dummy/public/favicon.ico +0 -0
  121. data/spec/fabricators/capability_fabricator.rb +4 -0
  122. data/spec/fabricators/role_fabricator.rb +9 -0
  123. data/spec/fabricators/user_fabricator.rb +3 -0
  124. data/spec/fabricators/user_group_fabricator.rb +9 -0
  125. data/spec/fixtures/application.rb +28 -0
  126. data/spec/fixtures/controllers.rb +5 -0
  127. data/spec/spec_helper.rb +89 -0
  128. data/spec/strongbolt/bolted_controller_spec.rb +706 -0
  129. data/spec/strongbolt/bolted_spec.rb +136 -0
  130. data/spec/strongbolt/capability_spec.rb +251 -0
  131. data/spec/strongbolt/configuration_spec.rb +119 -0
  132. data/spec/strongbolt/controllers/url_helpers_spec.rb +34 -0
  133. data/spec/strongbolt/helpers_spec.rb +43 -0
  134. data/spec/strongbolt/role_spec.rb +90 -0
  135. data/spec/strongbolt/tenantable_spec.rb +281 -0
  136. data/spec/strongbolt/user_abilities_spec.rb +509 -0
  137. data/spec/strongbolt/user_group_spec.rb +37 -0
  138. data/spec/strongbolt/users_tenant_spec.rb +36 -0
  139. data/spec/strongbolt_spec.rb +274 -0
  140. data/spec/support/controller_macros.rb +11 -0
  141. data/spec/support/db_setup.rb +134 -0
  142. data/spec/support/helpers.rb +62 -0
  143. data/spec/support/transactional_specs.rb +17 -0
  144. data/strongbolt.gemspec +32 -0
  145. metadata +407 -0
@@ -0,0 +1,73 @@
1
+ class CreateStrongboltTables < ActiveRecord::Migration
2
+ def change
3
+ create_table :strongbolt_capabilities, :force => true do |t|
4
+ t.string :name
5
+ t.string :description
6
+ t.string :model
7
+ t.string :action
8
+ t.string :attr
9
+ t.boolean :require_ownership, :default => false, :null => false
10
+ t.boolean :require_tenant_access, :default => true, :null => false
11
+
12
+ t.timestamps
13
+ end
14
+
15
+ create_table :strongbolt_roles, :force => true do |t|
16
+ t.string :name
17
+ t.integer :parent_id
18
+ t.integer :lft
19
+ t.integer :rgt
20
+ t.string :description
21
+
22
+ t.timestamps
23
+ end
24
+
25
+ create_table :strongbolt_user_groups, :force => true do |t|
26
+ t.string :name
27
+ t.text :description
28
+
29
+ t.timestamps
30
+ end
31
+
32
+ create_table :strongbolt_user_groups_users, :force => true do |t|
33
+ t.integer :user_group_id
34
+ t.integer :user_id
35
+ end
36
+
37
+ create_table :strongbolt_roles_user_groups, :force => true do |t|
38
+ t.integer :user_group_id
39
+ t.integer :role_id
40
+ end
41
+
42
+ create_table :strongbolt_capabilities_roles, :force => true do |t|
43
+ t.integer :role_id
44
+ t.integer :capability_id
45
+ end
46
+
47
+ create_table :strongbolt_users_tenants, :force => true do |t|
48
+ t.integer :user_id
49
+ t.integer :tenant_id
50
+ t.string :type
51
+ end
52
+
53
+ # Indexes
54
+ add_index :strongbolt_roles, :parent_id
55
+ add_index :strongbolt_roles, :lft
56
+ add_index :strongbolt_roles, :rgt
57
+
58
+ add_index :strongbolt_user_groups_users, :user_group_id
59
+ add_index :strongbolt_user_groups_users, :user_id
60
+
61
+ add_index :strongbolt_roles_user_groups, :user_group_id
62
+ add_index :strongbolt_roles_user_groups, :role_id
63
+
64
+ add_index :strongbolt_capabilities_roles, :role_id
65
+ add_index :strongbolt_capabilities_roles, :capability_id
66
+
67
+ add_index :strongbolt_users_tenants, :user_id
68
+ add_index :strongbolt_users_tenants, :tenant_id
69
+ add_index :strongbolt_users_tenants, :type
70
+ add_index :strongbolt_users_tenants, [:tenant_id, :type]
71
+ end
72
+ end
73
+
@@ -0,0 +1,45 @@
1
+ Strongbolt.setup do |config|
2
+ # Configure here the logger used by Strongbolt
3
+ config.logger = Rails.logger
4
+
5
+ #
6
+ # Set here the class name of your user class, if different than "User"
7
+ #
8
+ # config.user_class = "User"
9
+
10
+ #
11
+ # You can use this block to perform specific actions when a user is denied the access somewhere
12
+ #
13
+ # config.access_denied do |user, instance, action, request|
14
+ # Rails.logger.warn "User #{user.try :id} was refused to perform #{action} on #{instance.try :inspect} with request #{request}"
15
+ # end
16
+
17
+ #
18
+ # Specify here the list of tenants used by your application
19
+ #
20
+ # config.tenants = "Client", "Region"
21
+
22
+ #
23
+ # You can specify here some controllers where you don't want to perform any controller authorization check up
24
+ # It can be useful for instance with devise controllers, to avoid subclassing them.
25
+ # Write the controller names the same way you would with routes
26
+ #
27
+ # config.skip_controller_authorization_for "devise/confirmation"
28
+
29
+ #
30
+ # List here the set of default permissions granted to every user
31
+ # You will usually let every user access its own information for instance
32
+ #
33
+ config.default_capabilities = [
34
+ {:model => "User", :require_ownership => true, :require_tenant_access => false, :actions => [:find]}
35
+ ]
36
+
37
+ #
38
+ # If given a tenant, Strongbolt will try to detect all the models within your application.
39
+ # However, if some models don't have any direct or indirect dependencies on one of your tenant,
40
+ # Strongbolt won't find it.
41
+ #
42
+ # You can list here all the models of your application that doesn't indirectly belong to a tenant.
43
+ #
44
+ config.models = %MODELS%
45
+ end
@@ -0,0 +1,26 @@
1
+ require 'rails/generators/base'
2
+
3
+ module Strongbolt
4
+ module Generators
5
+ class ViewsGenerator < Rails::Generators::Base
6
+ desc "Copies Strongbolt views to your application."
7
+
8
+ argument :scope, required: false, default: nil,
9
+ desc: "The scope to copy views to"
10
+
11
+ public_task :copy_views
12
+
13
+ source_root File.expand_path("../../../../app/views", __FILE__)
14
+
15
+ def copy_views
16
+ directory :strongbolt, target_path
17
+ end
18
+
19
+ protected
20
+
21
+ def target_path
22
+ @target_path ||= "app/views/#{scope || :strongbolt}"
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,219 @@
1
+ require "active_record"
2
+ require "awesome_nested_set"
3
+
4
+ require "grant/grantable"
5
+ require "grant/status"
6
+ require 'grant/user'
7
+
8
+ require "strongbolt/version"
9
+ require "strongbolt/errors"
10
+ require "strongbolt/configuration"
11
+ require "strongbolt/tenantable"
12
+ require "strongbolt/bolted"
13
+ require "strongbolt/bolted_controller"
14
+ require "strongbolt/user_abilities"
15
+ require "strongbolt/base"
16
+ require "strongbolt/capability"
17
+ require "strongbolt/user_groups_user"
18
+ require "strongbolt/roles_user_group"
19
+ require "strongbolt/capabilities_role"
20
+ require "strongbolt/role"
21
+ require "strongbolt/user_group"
22
+ require "strongbolt/users_tenant"
23
+
24
+ #
25
+ # Raise an error if version of AR not compatible (4.1.0 and 4.1.1)
26
+ #
27
+ ar_version = ActiveRecord.version.version
28
+ if ar_version >= "4.1.0" && ar_version <= "4.1.1"
29
+ raise StandardError, "You cannot use Strongbolt with ActiveRecord versions 4.1.0 and 4.1.1. Please upgrade to >= 4.1.2"
30
+ end
31
+
32
+ #
33
+ # Includes every module needed (including Grant)
34
+ #
35
+ ActiveRecord::Base.send :include, Strongbolt::Bolted
36
+
37
+ #
38
+ # Default behavior, when method current_user defined on controller
39
+ #
40
+ if defined?(ActionController) and defined?(ActionController::Base)
41
+
42
+ ActionController::Base.send :include, Strongbolt::BoltedController
43
+
44
+ end
45
+
46
+ #
47
+ # Setup controllers, views, helpers and session related configuration
48
+ #
49
+ require 'strongbolt/engine' if defined?(Rails::Engine)
50
+
51
+
52
+ #
53
+ # Main module
54
+ #
55
+ module Strongbolt
56
+ extend Forwardable
57
+
58
+ def self.table_name_prefix
59
+ 'strongbolt_'
60
+ end
61
+
62
+ # Delegates to the configuration the access denied
63
+ def_delegators Configuration, :access_denied, :logger, :tenants, :user_class, :user_class_constant,
64
+ :default_capabilities
65
+ module_function :access_denied, :logger, :tenants, :user_class, :user_class_constant,
66
+ :default_capabilities
67
+
68
+ # Delegates switching thread behavior
69
+ def_delegators Grant::Status, :switch_to_multithread,
70
+ :switch_to_monothread
71
+ module_function :switch_to_multithread, :switch_to_monothread
72
+
73
+ #
74
+ # Tje parent controller to all strongbolt controllers
75
+ #
76
+ mattr_accessor :parent_controller
77
+ @@parent_controller = "ApplicationController"
78
+
79
+ #
80
+ # Current User
81
+ #
82
+ def self.current_user
83
+ Grant::User.current_user
84
+ end
85
+
86
+ # We keep an hash so we don't have each time to test
87
+ # if the module is included in the list
88
+ def self.current_user= user
89
+ # If user is an instance of something and different from what we have
90
+ if user.present?
91
+ # Raise error if wrong user class
92
+ unless valid_user? user
93
+ raise Strongbolt::WrongUserClass
94
+ end
95
+
96
+ # If the user class doesn't have included the module yet
97
+ unless user.class.included_modules.include? Strongbolt::UserAbilities
98
+ user.class.send :include, Strongbolt::UserAbilities
99
+ end
100
+ end
101
+
102
+ # Then we call the original grant method
103
+ Grant::User.current_user = user unless Grant::User.current_user == user
104
+ end
105
+
106
+ #
107
+ # Ensures the user instance given is a valid user for that configuration
108
+ # It checks whether the class or the base_class (in case of STI) of the instance class
109
+ # has been configured as the user model
110
+ #
111
+ def self.valid_user? user
112
+ user.class.name == Strongbolt::Configuration.user_class ||
113
+ user.class.base_class.name == Strongbolt::Configuration.user_class
114
+ end
115
+
116
+ #
117
+ # Setting up Strongbolt
118
+ #
119
+ def self.setup &block
120
+ # Configuration by user
121
+ block.call Configuration
122
+
123
+ # Include the User::Abilities
124
+ begin
125
+ user_class = Configuration.user_class
126
+ user_class = user_class.constantize if user_class.is_a? String
127
+ user_class.send(:include, Strongbolt::UserAbilities) unless user_class.included_modules.include?(Strongbolt::UserAbilities)
128
+ rescue NameError
129
+ logger.warn "User class #{Configuration.user_class} wasn't found"
130
+ end
131
+ rescue => e
132
+ error = <<-CONTENT
133
+ [ERROR] Strongbolt could not initialized successfully.
134
+ This can happen when running migrations, and in this situation, you can ignore this message.
135
+ If it happens in test, make sure you've run `rake db:test:prepare` so that test database is ready.
136
+ Otherwise, please review the error below to check what happened:
137
+
138
+ Error message:
139
+ #{e.message}
140
+
141
+ #{e.backtrace.join("\n")}
142
+ CONTENT
143
+ logger.fatal error
144
+ # Display in the console when error test env
145
+ puts error if defined?(Rails) && Rails.env.test?
146
+ # If not being done in a rake task, this should propagate the error
147
+ raise e unless $0 =~ /rake$/ # && ARGV.join(" ").include?("db:")
148
+ end
149
+
150
+ #
151
+ # Perform the block without grant
152
+ #
153
+ def self.without_authorization &block
154
+ Grant::Status.without_grant &block
155
+ end
156
+
157
+ #
158
+ # Perform the block with grant
159
+ #
160
+ def self.with_authorization &block
161
+ Grant::Status.with_grant &block
162
+ end
163
+
164
+ #
165
+ # Disable authorization checking
166
+ #
167
+ def self.disable_authorization
168
+ Grant::Status.disable_grant
169
+ end
170
+
171
+ def self.enable_authorization
172
+ Grant::Status.enable_grant
173
+ end
174
+
175
+ def self.enabled?
176
+ Grant::Status.grant_enabled?
177
+ end
178
+ def self.disabled?
179
+ ! enabled?
180
+ end
181
+
182
+ # Include helpers in the given scope to AC and AV.
183
+ def self.include_helpers(scope)
184
+ ActiveSupport.on_load(:action_controller) do
185
+ include scope::UrlHelpers
186
+ end
187
+
188
+ ActiveSupport.on_load(:action_view) do
189
+ include scope::UrlHelpers
190
+ end
191
+ end
192
+
193
+ # Not to use directly
194
+ def self.tenants= tenants
195
+ @@tenants = tenants
196
+ end
197
+ end
198
+
199
+ #
200
+ # We add a method to any object to quickly tell which method
201
+ # should not have any authorization check perform
202
+ #
203
+ class Object
204
+ def self.perform_without_authorization *method_names
205
+ method_names.each {|name| setup_without_authorization name}
206
+ end
207
+
208
+ private
209
+
210
+ def self.setup_without_authorization method_name
211
+ aliased_name = "_with_autorization_#{method_name}"
212
+ alias_method aliased_name, method_name
213
+ define_method method_name do |*args, &block|
214
+ Strongbolt.without_authorization do
215
+ send aliased_name, *args, &block
216
+ end
217
+ end
218
+ end
219
+ end
@@ -0,0 +1,7 @@
1
+ module Strongbolt
2
+ class Base < ActiveRecord::Base
3
+ include Bolted
4
+
5
+ self.abstract_class = true
6
+ end
7
+ end
@@ -0,0 +1,125 @@
1
+ #
2
+ # Included in the base class of models (ActiveRecord::Base),
3
+ # this module is the entry point of all authorization.
4
+ #
5
+ # It implements helper methods that will be used by a lot of other models
6
+ #
7
+ module Strongbolt
8
+ module Bolted
9
+ module ClassMethods
10
+ #
11
+ # Returns true if grant is currently enable, the user is set and we're not in the console
12
+ # ie when we need to perform a check
13
+ #
14
+ def bolted?
15
+ !unbolted?
16
+ end
17
+
18
+ #
19
+ # Not secure if Grant is disabled, there's no current user
20
+ # or if we're using Rails console
21
+ #
22
+ def unbolted?
23
+ Grant::Status.grant_disabled? || (defined?(Rails) && defined?(Rails.console)) ||
24
+ Strongbolt.current_user.nil?
25
+ end
26
+
27
+ #
28
+ # Returns true if the model is owned, ie if it has a belongs_to
29
+ # relationship with the user class
30
+ #
31
+ def owned?
32
+ @owned ||= name == Configuration.user_class || owner_association.present?
33
+ end
34
+
35
+ #
36
+ # Returns the association to the user, if present
37
+ #
38
+ def owner_association
39
+ @owner_association ||= reflect_on_all_associations(:belongs_to).select do |assoc|
40
+ unless assoc.options.has_key? :polymorphic
41
+ assoc.klass.name == Configuration.user_class
42
+ else
43
+ false
44
+ end
45
+ end.try(:first)
46
+ end
47
+
48
+ #
49
+ # Returns the name of the attribute containing the owner id
50
+ #
51
+ def owner_attribute
52
+ return unless owned?
53
+
54
+ @owner_attribute ||= if name == Configuration.user_class
55
+ :id
56
+ else
57
+ owner_association.foreign_key.to_sym
58
+ end
59
+ end
60
+
61
+ #
62
+ # Returns the model name for authorization
63
+ #
64
+ def name_for_authorization
65
+ @name_for_authorization ||= self.name
66
+ end
67
+
68
+ #
69
+ # Authorize as another model
70
+ #
71
+ def authorize_as model_name
72
+ @name_for_authorization = model_name
73
+ end
74
+
75
+ end
76
+
77
+ module InstanceMethods
78
+ #
79
+ # Asks permission to performa an operation on the current instance
80
+ #
81
+ def accessible?(action, attrs = :any)
82
+ unbolted? || Grant::User.current_user.can?(action, self, attrs)
83
+ end
84
+
85
+ #
86
+ # Returns the owner id according to what's
87
+ #
88
+ def strongbolt_owner_id
89
+ raise ModelNotOwned unless self.class.owned?
90
+
91
+ send self.class.owner_attribute
92
+ end
93
+ end
94
+
95
+ def self.included(receiver)
96
+ receiver.extend ClassMethods
97
+ receiver.send :include, InstanceMethods
98
+ receiver.send :include, Strongbolt::Tenantable
99
+ receiver.send :include, Grant::Grantable
100
+
101
+ # We add the grant to filter everything
102
+ receiver.class_eval do
103
+
104
+ #
105
+ # We use the grant helper method to test authorizations on all methods
106
+ #
107
+ grant(:find, :create, :update, :destroy) do |user, instance, action|
108
+ # Strongbolt.logger.debug { "Checking for #{action} on #{instance}\n\n#{Kernel.caller.join("\n")}" }
109
+ # Check the user permission unless no user or rails console
110
+ # Not using unbolted? here
111
+ granted = ((defined?(Rails) && defined?(Rails.console)) || user.nil?) ||
112
+ user.can?( action, instance )
113
+
114
+ # If not granted, trigger the access denied
115
+ unless granted
116
+ Strongbolt.access_denied user, instance, action, $request.try(:fullpath)
117
+ end
118
+
119
+ granted
120
+ end # End Grant
121
+
122
+ end
123
+ end
124
+ end
125
+ end