api_guardian 0.1.0.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +125 -0
- data/Rakefile +30 -0
- data/app/controllers/api_guardian/api_controller.rb +112 -0
- data/app/controllers/api_guardian/application_controller.rb +11 -0
- data/app/controllers/api_guardian/permissions_controller.rb +7 -0
- data/app/controllers/api_guardian/registration_controller.rb +38 -0
- data/app/controllers/api_guardian/roles_controller.rb +19 -0
- data/app/controllers/api_guardian/users_controller.rb +20 -0
- data/app/models/api_guardian/permission.rb +14 -0
- data/app/models/api_guardian/role.rb +97 -0
- data/app/models/api_guardian/role_permission.rb +8 -0
- data/app/models/api_guardian/user.rb +23 -0
- data/app/serializers/api_guardian/permission_serializer.rb +7 -0
- data/app/serializers/api_guardian/role_serializer.rb +7 -0
- data/app/serializers/api_guardian/user_serializer.rb +10 -0
- data/config/initializers/api_guardian.rb +10 -0
- data/config/initializers/doorkeeper.rb +143 -0
- data/config/routes.rb +20 -0
- data/db/migrate/20151117191338_api_guardian_enable_uuid_extension.rb +5 -0
- data/db/migrate/20151117191911_create_api_guardian_roles.rb +9 -0
- data/db/migrate/20151117195618_create_api_guardian_users.rb +25 -0
- data/db/migrate/20151117212826_create_api_guardian_permissions.rb +10 -0
- data/db/migrate/20151117213145_create_api_guardian_role_permissions.rb +11 -0
- data/db/migrate/20151117225238_create_doorkeeper_tables.rb +42 -0
- data/db/seeds.rb +32 -0
- data/lib/api_guardian.rb +80 -0
- data/lib/api_guardian/concerns/api_errors/handler.rb +145 -0
- data/lib/api_guardian/concerns/api_errors/renderer.rb +45 -0
- data/lib/api_guardian/concerns/api_request/validator.rb +66 -0
- data/lib/api_guardian/configuration.rb +171 -0
- data/lib/api_guardian/engine.rb +23 -0
- data/lib/api_guardian/errors/invalid_content_type_error.rb +6 -0
- data/lib/api_guardian/errors/invalid_permission_name_error.rb +6 -0
- data/lib/api_guardian/errors/invalid_request_body_error.rb +6 -0
- data/lib/api_guardian/errors/invalid_request_resource_id_error.rb +6 -0
- data/lib/api_guardian/errors/invalid_request_resource_type_error.rb +6 -0
- data/lib/api_guardian/errors/invalid_update_action_error.rb +6 -0
- data/lib/api_guardian/errors/reset_token_expired_error.rb +6 -0
- data/lib/api_guardian/errors/reset_token_user_mismatch_error.rb +6 -0
- data/lib/api_guardian/policies/application_policy.rb +65 -0
- data/lib/api_guardian/policies/permission_policy.rb +15 -0
- data/lib/api_guardian/policies/role_policy.rb +15 -0
- data/lib/api_guardian/policies/user_policy.rb +23 -0
- data/lib/api_guardian/stores/base.rb +53 -0
- data/lib/api_guardian/stores/permission_store.rb +6 -0
- data/lib/api_guardian/stores/role_store.rb +9 -0
- data/lib/api_guardian/stores/user_store.rb +86 -0
- data/lib/api_guardian/version.rb +3 -0
- data/lib/generators/api_guardian/install/USAGE +8 -0
- data/lib/generators/api_guardian/install/install_generator.rb +19 -0
- data/lib/generators/api_guardian/install/templates/README +1 -0
- data/lib/generators/api_guardian/install/templates/api_guardian.rb +5 -0
- data/lib/tasks/api_guardian_tasks.rake +4 -0
- data/spec/concerns/api_errors/handler_spec.rb +114 -0
- data/spec/concerns/api_request/validator_spec.rb +102 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +25 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +13 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/schema.rb +104 -0
- data/spec/dummy/log/test.log +5031 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/permissions.rb +6 -0
- data/spec/factories/role_permissions.rb +6 -0
- data/spec/factories/roles.rb +24 -0
- data/spec/factories/users.rb +11 -0
- data/spec/models/permission_spec.rb +28 -0
- data/spec/models/role_permission_spec.rb +27 -0
- data/spec/models/role_spec.rb +209 -0
- data/spec/models/user_spec.rb +44 -0
- data/spec/policies/application_policy_spec.rb +118 -0
- data/spec/policies/permission_policy_spec.rb +28 -0
- data/spec/policies/role_policy_spec.rb +28 -0
- data/spec/policies/user_policy_spec.rb +29 -0
- data/spec/requests/permissions_controller_spec.rb +19 -0
- data/spec/requests/registration_controller_spec.rb +151 -0
- data/spec/requests/roles_controller_spec.rb +75 -0
- data/spec/requests/users_controller_spec.rb +75 -0
- data/spec/spec_helper.rb +138 -0
- data/spec/stores/base_spec.rb +113 -0
- data/spec/stores/permission_store_spec.rb +2 -0
- data/spec/stores/role_store_spec.rb +12 -0
- data/spec/stores/user_store_spec.rb +144 -0
- data/spec/support/controller_concern_test_helpers.rb +21 -0
- data/spec/support/matchers.rb +37 -0
- data/spec/support/request_helpers.rb +111 -0
- metadata +508 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
module ApiGuardian
|
|
2
|
+
class RolePermission < ActiveRecord::Base
|
|
3
|
+
belongs_to :role, class_name: ApiGuardian.role_class.to_s
|
|
4
|
+
belongs_to :permission, class_name: ApiGuardian.permission_class.to_s
|
|
5
|
+
|
|
6
|
+
validates :role_id, uniqueness: { scope: :permission_id, message: 'Permission combination already exists!' }
|
|
7
|
+
end
|
|
8
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module ApiGuardian
|
|
2
|
+
class User < ActiveRecord::Base
|
|
3
|
+
acts_as_paranoid
|
|
4
|
+
has_secure_password
|
|
5
|
+
|
|
6
|
+
belongs_to :role, class_name: ApiGuardian.role_class.to_s
|
|
7
|
+
|
|
8
|
+
delegate :can?, :cannot?, to: :role
|
|
9
|
+
|
|
10
|
+
validates :email, presence: true, uniqueness: true
|
|
11
|
+
validates :password, length: { minimum: 8 }, if: :password
|
|
12
|
+
|
|
13
|
+
# Class Methods
|
|
14
|
+
def self.policy_class
|
|
15
|
+
ApiGuardian::Policies::UserPolicy
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Instance Methods
|
|
19
|
+
def reset_password_token_valid?
|
|
20
|
+
!reset_password_sent_at.nil? && 24.hours.ago <= reset_password_sent_at
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
::Doorkeeper.configure do
|
|
2
|
+
# Change the ORM that doorkeeper will use (needs plugins)
|
|
3
|
+
orm :active_record
|
|
4
|
+
|
|
5
|
+
# This block will be called to check whether the resource owner is authenticated or not.
|
|
6
|
+
resource_owner_from_credentials do
|
|
7
|
+
u = ApiGuardian.user_class.find_by(email: params[:email])
|
|
8
|
+
u if u && u.try(:authenticate, params[:password])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# If you want to restrict access to the web interface for adding oauth authorized applications, you need to declare the block below.
|
|
12
|
+
# admin_authenticator do
|
|
13
|
+
# # Put your admin authentication logic here.
|
|
14
|
+
# # Example implementation:
|
|
15
|
+
# Admin.find_by_id(session[:admin_id]) || redirect_to(new_admin_session_url)
|
|
16
|
+
# end
|
|
17
|
+
|
|
18
|
+
# Authorization Code expiration time (default 10 minutes).
|
|
19
|
+
# authorization_code_expires_in 10.minutes
|
|
20
|
+
|
|
21
|
+
# Access token expiration time (default 2 hours).
|
|
22
|
+
# If you want to disable expiration, set this to nil.
|
|
23
|
+
# access_token_expires_in 2.hours
|
|
24
|
+
|
|
25
|
+
# Assign a custom TTL for implicit grants.
|
|
26
|
+
# custom_access_token_expires_in do |oauth_client|
|
|
27
|
+
# oauth_client.application.additional_settings.implicit_oauth_expiration
|
|
28
|
+
# end
|
|
29
|
+
|
|
30
|
+
# Use a custom class for generating the access token.
|
|
31
|
+
# https://github.com/doorkeeper-gem/doorkeeper#custom-access-token-generator
|
|
32
|
+
access_token_generator '::Doorkeeper::JWT'
|
|
33
|
+
|
|
34
|
+
# Reuse access token for the same resource owner within an application (disabled by default)
|
|
35
|
+
# Rationale: https://github.com/doorkeeper-gem/doorkeeper/issues/383
|
|
36
|
+
# reuse_access_token
|
|
37
|
+
|
|
38
|
+
# Issue access tokens with refresh token (disabled by default)
|
|
39
|
+
use_refresh_token
|
|
40
|
+
|
|
41
|
+
# Provide support for an owner to be assigned to each registered application (disabled by default)
|
|
42
|
+
# Optional parameter :confirmation => true (default false) if you want to enforce ownership of
|
|
43
|
+
# a registered application
|
|
44
|
+
# Note: you must also run the rails g doorkeeper:application_owner generator to provide the necessary support
|
|
45
|
+
# enable_application_owner :confirmation => false
|
|
46
|
+
|
|
47
|
+
# Define access token scopes for your provider
|
|
48
|
+
# For more information go to
|
|
49
|
+
# https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes
|
|
50
|
+
# default_scopes :public
|
|
51
|
+
# optional_scopes :write, :update
|
|
52
|
+
|
|
53
|
+
# Change the way client credentials are retrieved from the request object.
|
|
54
|
+
# By default it retrieves first from the `HTTP_AUTHORIZATION` header, then
|
|
55
|
+
# falls back to the `:client_id` and `:client_secret` params from the `params` object.
|
|
56
|
+
# Check out the wiki for more information on customization
|
|
57
|
+
# client_credentials :from_basic, :from_params
|
|
58
|
+
|
|
59
|
+
# Change the way access token is authenticated from the request object.
|
|
60
|
+
# By default it retrieves first from the `HTTP_AUTHORIZATION` header, then
|
|
61
|
+
# falls back to the `:access_token` or `:bearer_token` params from the `params` object.
|
|
62
|
+
# Check out the wiki for more information on customization
|
|
63
|
+
# access_token_methods :from_bearer_authorization, :from_access_token_param, :from_bearer_param
|
|
64
|
+
|
|
65
|
+
# Change the native redirect uri for client apps
|
|
66
|
+
# When clients register with the following redirect uri, they won't be redirected to any server and the authorization code will be displayed within the provider
|
|
67
|
+
# The value can be any string. Use nil to disable this feature. When disabled, clients must provide a valid URL
|
|
68
|
+
# (Similar behaviour: https://developers.google.com/accounts/docs/OAuth2InstalledApp#choosingredirecturi)
|
|
69
|
+
#
|
|
70
|
+
# native_redirect_uri 'urn:ietf:wg:oauth:2.0:oob'
|
|
71
|
+
|
|
72
|
+
# Forces the usage of the HTTPS protocol in non-native redirect uris (enabled
|
|
73
|
+
# by default in non-development environments). OAuth2 delegates security in
|
|
74
|
+
# communication to the HTTPS protocol so it is wise to keep this enabled.
|
|
75
|
+
#
|
|
76
|
+
# force_ssl_in_redirect_uri !Rails.env.development?
|
|
77
|
+
|
|
78
|
+
# Specify what grant flows are enabled in array of Strings. The valid
|
|
79
|
+
# strings and the flows they enable are:
|
|
80
|
+
#
|
|
81
|
+
# "authorization_code" => Authorization Code Grant Flow
|
|
82
|
+
# "implicit" => Implicit Grant Flow
|
|
83
|
+
# "password" => Resource Owner Password Credentials Grant Flow
|
|
84
|
+
# "client_credentials" => Client Credentials Grant Flow
|
|
85
|
+
#
|
|
86
|
+
# If not specified, Doorkeeper enables authorization_code and
|
|
87
|
+
# client_credentials.
|
|
88
|
+
#
|
|
89
|
+
# implicit and password grant flows have risks that you should understand
|
|
90
|
+
# before enabling:
|
|
91
|
+
# http://tools.ietf.org/html/rfc6819#section-4.4.2
|
|
92
|
+
# http://tools.ietf.org/html/rfc6819#section-4.4.3
|
|
93
|
+
#
|
|
94
|
+
grant_flows %w(password)
|
|
95
|
+
|
|
96
|
+
# Under some circumstances you might want to have applications auto-approved,
|
|
97
|
+
# so that the user skips the authorization step.
|
|
98
|
+
# For example if dealing with a trusted application.
|
|
99
|
+
# skip_authorization do |resource_owner, client|
|
|
100
|
+
# client.superapp? or resource_owner.admin?
|
|
101
|
+
# end
|
|
102
|
+
|
|
103
|
+
# WWW-Authenticate Realm (default "Doorkeeper").
|
|
104
|
+
# realm "Doorkeeper"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
::Doorkeeper::JWT.configure do
|
|
108
|
+
# Set the payload for the JWT token. This should contain unique information
|
|
109
|
+
# about the user.
|
|
110
|
+
# Defaults to a randomly generated token in a hash
|
|
111
|
+
# { token: "RANDOM-TOKEN" }
|
|
112
|
+
token_payload do |opts|
|
|
113
|
+
user = ApiGuardian.user_class.find(opts[:resource_owner_id])
|
|
114
|
+
iat = DateTime.current.utc.to_i
|
|
115
|
+
{
|
|
116
|
+
iss: 'guideon:washington',
|
|
117
|
+
iat: iat,
|
|
118
|
+
exp: iat + opts[:expires_in],
|
|
119
|
+
jti: Digest::MD5.hexdigest([SecureRandom.hex, iat].join(':')),
|
|
120
|
+
sub: user.id,
|
|
121
|
+
user: {
|
|
122
|
+
id: user.id,
|
|
123
|
+
email: user.email
|
|
124
|
+
},
|
|
125
|
+
permissions: user.role.permissions
|
|
126
|
+
}
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Set the encryption secret. This would be shared with any other applications
|
|
130
|
+
# that should be able to read the payload of the token.
|
|
131
|
+
# Defaults to "secret"
|
|
132
|
+
secret_key 'MY-SECRET'
|
|
133
|
+
|
|
134
|
+
# If you want to use RS* encoding specify the path to the RSA key
|
|
135
|
+
# to use for signing.
|
|
136
|
+
# If you specify a secret_key_path it will be used instead of secret_key
|
|
137
|
+
# secret_key_path 'path/to/file.pem'
|
|
138
|
+
|
|
139
|
+
# Specify encryption type. Supports any algorithim in
|
|
140
|
+
# https://github.com/progrium/ruby-jwt
|
|
141
|
+
# defaults to nil
|
|
142
|
+
encryption_method :hs256
|
|
143
|
+
end
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
ApiGuardian::Engine.routes.draw do
|
|
2
|
+
# Registration
|
|
3
|
+
post '/register' => 'registration#create'
|
|
4
|
+
post '/reset-password' => 'registration#reset_password'
|
|
5
|
+
post '/complete-reset-password' => 'registration#complete_reset_password'
|
|
6
|
+
|
|
7
|
+
# API v1
|
|
8
|
+
use_doorkeeper scope: 'auth' do
|
|
9
|
+
skip_controllers :applications, :authorized_applications
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
resources :users, except: [:new, :edit] do
|
|
13
|
+
get 'permissions', on: :member
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
resources :roles, except: [:new, :edit]
|
|
17
|
+
resources :permissions, only: [:index]
|
|
18
|
+
|
|
19
|
+
match '*unmatched_route', to: 'application#not_found', via: :all
|
|
20
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class CreateApiGuardianUsers < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
create_table :api_guardian_users, id: :uuid do |t|
|
|
4
|
+
t.string :first_name
|
|
5
|
+
t.string :last_name
|
|
6
|
+
t.string :email
|
|
7
|
+
t.datetime :email_confirmed_at
|
|
8
|
+
t.string :phone_number
|
|
9
|
+
t.datetime :phone_number_confirmed_at
|
|
10
|
+
t.string :password_digest, null: false
|
|
11
|
+
t.boolean :active, default: false
|
|
12
|
+
t.uuid :role_id, null: false
|
|
13
|
+
t.string :reset_password_token
|
|
14
|
+
t.datetime :reset_password_sent_at
|
|
15
|
+
t.datetime :deleted_at
|
|
16
|
+
|
|
17
|
+
t.timestamps null: false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
add_index 'api_guardian_users', ['deleted_at'], name: 'index_api_guardian_users_on_deleted_at', using: :btree
|
|
21
|
+
add_index 'api_guardian_users', ['email'], name: 'index_api_guardian_users_on_email', unique: true, using: :btree
|
|
22
|
+
add_index 'api_guardian_users', ['reset_password_token'], name: 'index_api_guardian_users_on_reset_password_token', unique: true, using: :btree
|
|
23
|
+
add_index 'api_guardian_users', ['role_id'], name: 'index_api_guardian_users_on_role_id', using: :btree
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class CreateApiGuardianRolePermissions < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
create_table :api_guardian_role_permissions, id: :uuid do |t|
|
|
4
|
+
t.uuid :role_id
|
|
5
|
+
t.uuid :permission_id
|
|
6
|
+
t.boolean :granted, default: false
|
|
7
|
+
|
|
8
|
+
t.timestamps null: false
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
class CreateDoorkeeperTables < ActiveRecord::Migration
|
|
2
|
+
def change
|
|
3
|
+
create_table :oauth_applications, id: :uuid do |t|
|
|
4
|
+
t.string :name, null: false
|
|
5
|
+
t.string :uid, null: false
|
|
6
|
+
t.string :secret, null: false
|
|
7
|
+
t.text :redirect_uri, null: false
|
|
8
|
+
t.string :scopes, null: false, default: ''
|
|
9
|
+
t.timestamps
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
add_index :oauth_applications, :uid, unique: true
|
|
13
|
+
|
|
14
|
+
create_table :oauth_access_grants, id: :uuid do |t|
|
|
15
|
+
t.uuid :resource_owner_id, null: false
|
|
16
|
+
t.uuid :application_id, null: false
|
|
17
|
+
t.string :token, null: false
|
|
18
|
+
t.integer :expires_in, null: false
|
|
19
|
+
t.text :redirect_uri, null: false
|
|
20
|
+
t.datetime :created_at, null: false
|
|
21
|
+
t.datetime :revoked_at
|
|
22
|
+
t.string :scopes
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
add_index :oauth_access_grants, :token, unique: true
|
|
26
|
+
|
|
27
|
+
create_table :oauth_access_tokens, id: :uuid do |t|
|
|
28
|
+
t.uuid :resource_owner_id
|
|
29
|
+
t.uuid :application_id
|
|
30
|
+
t.text :token, null: false
|
|
31
|
+
t.string :refresh_token
|
|
32
|
+
t.integer :expires_in
|
|
33
|
+
t.datetime :revoked_at
|
|
34
|
+
t.datetime :created_at, null: false
|
|
35
|
+
t.string :scopes
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
add_index :oauth_access_tokens, :token, unique: true
|
|
39
|
+
add_index :oauth_access_tokens, :resource_owner_id
|
|
40
|
+
add_index :oauth_access_tokens, :refresh_token, unique: true
|
|
41
|
+
end
|
|
42
|
+
end
|
data/db/seeds.rb
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Roles
|
|
2
|
+
admin_role = ApiGuardian.role_class.create!(name: 'Super Admin')
|
|
3
|
+
user_role = ApiGuardian.role_class.create!(name: 'User', default: true)
|
|
4
|
+
|
|
5
|
+
# Permissions
|
|
6
|
+
ApiGuardian.permission_class.create!(name: 'user:create', desc: 'Ability to create User resource.')
|
|
7
|
+
ApiGuardian.permission_class.create!(name: 'user:read', desc: 'Ability to read User resource.')
|
|
8
|
+
ApiGuardian.permission_class.create!(name: 'user:update', desc: 'Ability to update User resource.')
|
|
9
|
+
ApiGuardian.permission_class.create!(name: 'user:delete', desc: 'Ability to delete User resource.')
|
|
10
|
+
ApiGuardian.permission_class.create!(name: 'user:manage', desc: 'Ability to manage User resource.')
|
|
11
|
+
|
|
12
|
+
ApiGuardian.permission_class.create!(name: 'role:create', desc: 'Ability to create Role resource.')
|
|
13
|
+
ApiGuardian.permission_class.create!(name: 'role:read', desc: 'Ability to read Role resource.')
|
|
14
|
+
ApiGuardian.permission_class.create!(name: 'role:update', desc: 'Ability to update Role resource.')
|
|
15
|
+
ApiGuardian.permission_class.create!(name: 'role:delete', desc: 'Ability to delete Role resource.')
|
|
16
|
+
ApiGuardian.permission_class.create!(name: 'role:manage', desc: 'Ability to manage Role resource.')
|
|
17
|
+
|
|
18
|
+
ApiGuardian.permission_class.create!(name: 'permission:create', desc: 'Ability to create Permission resource.')
|
|
19
|
+
ApiGuardian.permission_class.create!(name: 'permission:read', desc: 'Ability to read Permission resource.')
|
|
20
|
+
ApiGuardian.permission_class.create!(name: 'permission:update', desc: 'Ability to update Permission resource.')
|
|
21
|
+
ApiGuardian.permission_class.create!(name: 'permission:delete', desc: 'Ability to delete Permission resource.')
|
|
22
|
+
ApiGuardian.permission_class.create!(name: 'permission:manage', desc: 'Ability to manage Permission resource.')
|
|
23
|
+
|
|
24
|
+
admin_role.create_default_permissions true
|
|
25
|
+
user_role.create_default_permissions false
|
|
26
|
+
|
|
27
|
+
# User
|
|
28
|
+
ApiGuardian.user_class.create!(
|
|
29
|
+
first_name: 'Travis', last_name: 'Vignon', email: 'travis@lookitsatravis.com',
|
|
30
|
+
password: 'password', password_confirmation: 'password', role: admin_role,
|
|
31
|
+
active: true, email_confirmed_at: DateTime.now.utc
|
|
32
|
+
)
|
data/lib/api_guardian.rb
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
require 'rails-api'
|
|
2
|
+
require 'doorkeeper'
|
|
3
|
+
require 'doorkeeper-jwt'
|
|
4
|
+
require 'pundit'
|
|
5
|
+
require 'paranoia'
|
|
6
|
+
require 'rack/cors'
|
|
7
|
+
require 'kaminari'
|
|
8
|
+
require 'active_model_serializers'
|
|
9
|
+
require 'api_guardian/configuration'
|
|
10
|
+
require "api_guardian/engine"
|
|
11
|
+
|
|
12
|
+
module ApiGuardian
|
|
13
|
+
module Concerns
|
|
14
|
+
module ApiErrors
|
|
15
|
+
autoload :Handler, 'api_guardian/concerns/api_errors/handler'
|
|
16
|
+
autoload :Renderer, 'api_guardian/concerns/api_errors/renderer'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module ApiRequest
|
|
20
|
+
autoload :Validator, 'api_guardian/concerns/api_request/validator'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
module Errors
|
|
25
|
+
autoload :InvalidContentTypeError, 'api_guardian/errors/invalid_content_type_error'
|
|
26
|
+
autoload :InvalidPermissionNameError, 'api_guardian/errors/invalid_permission_name_error'
|
|
27
|
+
autoload :InvalidRequestBodyError, 'api_guardian/errors/invalid_request_body_error'
|
|
28
|
+
autoload :InvalidRequestResourceIdError, 'api_guardian/errors/invalid_request_resource_id_error'
|
|
29
|
+
autoload :InvalidRequestResourceTypeError, 'api_guardian/errors/invalid_request_resource_type_error'
|
|
30
|
+
autoload :InvalidUpdateActionError, 'api_guardian/errors/invalid_update_action_error'
|
|
31
|
+
autoload :ResetTokenExpiredError, 'api_guardian/errors/reset_token_expired_error'
|
|
32
|
+
autoload :ResetTokenUserMismatchError, 'api_guardian/errors/reset_token_user_mismatch_error'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
module Stores
|
|
36
|
+
autoload :Base, 'api_guardian/stores/base'
|
|
37
|
+
autoload :UserStore, 'api_guardian/stores/user_store'
|
|
38
|
+
autoload :RoleStore, 'api_guardian/stores/role_store'
|
|
39
|
+
autoload :PermissionStore, 'api_guardian/stores/permission_store'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
module Policies
|
|
43
|
+
autoload :ApplicationPolicy, 'api_guardian/policies/application_policy'
|
|
44
|
+
autoload :PermissionPolicy, 'api_guardian/policies/permission_policy'
|
|
45
|
+
autoload :RolePolicy, 'api_guardian/policies/role_policy'
|
|
46
|
+
autoload :UserPolicy, 'api_guardian/policies/user_policy'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
mattr_accessor :user_class
|
|
50
|
+
@@user_class = 'ApiGuardian::User'
|
|
51
|
+
|
|
52
|
+
mattr_accessor :role_class
|
|
53
|
+
@@role_class = 'ApiGuardian::Role'
|
|
54
|
+
|
|
55
|
+
mattr_accessor :permission_class
|
|
56
|
+
@@permission_class = 'ApiGuardian::Permission'
|
|
57
|
+
|
|
58
|
+
mattr_accessor :role_permission_class
|
|
59
|
+
@@role_permission_class = 'ApiGuardian::RolePermission'
|
|
60
|
+
|
|
61
|
+
def self.user_class
|
|
62
|
+
@@user_class.constantize
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def self.role_class
|
|
66
|
+
@@role_class.constantize
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.permission_class
|
|
70
|
+
@@permission_class.constantize
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def self.role_permission_class
|
|
74
|
+
@@role_permission_class.constantize
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.setup
|
|
78
|
+
yield self
|
|
79
|
+
end
|
|
80
|
+
end
|