mks_auth 1.0.0 → 1.0.4

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.
Files changed (44) hide show
  1. checksums.yaml +5 -5
  2. data/app/controllers/mks/auth/application_controller.rb +39 -13
  3. data/app/controllers/mks/auth/application_modules_controller.rb +0 -2
  4. data/app/controllers/mks/auth/menus_controller.rb +29 -0
  5. data/app/controllers/mks/auth/user_roles_controller.rb +41 -31
  6. data/app/controllers/mks/auth/users_controller.rb +45 -20
  7. data/app/models/mks/auth/application_module.rb +3 -3
  8. data/app/models/mks/auth/menu.rb +5 -5
  9. data/app/models/mks/auth/user.rb +26 -8
  10. data/app/models/mks/auth/user_role.rb +6 -5
  11. data/config/routes.rb +17 -18
  12. data/db/migrate/20161029065810_create_mks_auth_application_modules.rb +1 -1
  13. data/db/migrate/20161029065959_create_mks_auth_users.rb +1 -4
  14. data/db/migrate/20161029070807_create_mks_auth_user_roles.rb +3 -2
  15. data/db/migrate/20161029071047_create_mks_users_user_roles.rb +4 -4
  16. data/db/migrate/20161029072256_create_mks_auth_menus.rb +3 -3
  17. data/db/migrate/20161029074023_create_mks_menus_user_roles.rb +3 -3
  18. data/db/migrate/20180201104912_create_mks_users_application_modules.rb +12 -0
  19. data/lib/mks/auth/engine.rb +5 -12
  20. data/lib/mks/auth/token_auth.rb +19 -0
  21. data/lib/mks/auth/version.rb +1 -1
  22. data/lib/mks_auth.rb +1 -0
  23. data/spec/controllers/mks/auth/menus_controller_spec.rb +53 -0
  24. data/spec/controllers/mks/auth/user_roles_controller_spec.rb +130 -0
  25. data/spec/controllers/mks/auth/users_controller_spec.rb +67 -1
  26. data/spec/dummy/config/application.rb +2 -0
  27. data/spec/dummy/config/database.yml +5 -3
  28. data/spec/dummy/config/initializers/new_framework_defaults.rb +1 -1
  29. data/spec/dummy/db/schema.rb +38 -30
  30. data/spec/dummy/log/development.log +13666 -3
  31. data/spec/dummy/log/test.log +34964 -0
  32. data/spec/factories/application_modules.rb +1 -1
  33. data/spec/factories/menus.rb +1 -1
  34. data/spec/factories/user_roles.rb +2 -1
  35. data/spec/factories/users.rb +1 -2
  36. data/spec/models/mks/auth/application_module_spec.rb +2 -1
  37. data/spec/models/mks/auth/user_spec.rb +10 -0
  38. data/spec/rails_helper.rb +1 -0
  39. data/spec/spec_helper.rb +1 -1
  40. data/spec/support/factory_girl.rb +2 -2
  41. metadata +82 -62
  42. data/app/controllers/mks/auth/access_controller.rb +0 -51
  43. data/app/helpers/mks/auth/access_helper.rb +0 -47
  44. data/app/helpers/mks/auth/application_helper.rb +0 -10
@@ -0,0 +1,53 @@
1
+ require 'rails_helper'
2
+
3
+ module Mks
4
+ module Auth
5
+ RSpec.describe MenusController, type: :controller do
6
+ routes { Mks::Auth::Engine.routes }
7
+
8
+ before(:each) do
9
+ u = create(:user)
10
+ token = Mks::Auth::TokenAuth.issue(name: u.full_name, email: u.email, id: u.id)
11
+ request.headers['Authorization'] = "Bearer #{token}"
12
+ end
13
+
14
+ describe 'GET #menus' do
15
+ it 'gets menus for user' do
16
+ m = create(:application_module)
17
+ ur = create(:user_role, application_module: m)
18
+ user = create(:user, roles: [ur])
19
+ p1 = create(:menu, roles: [ur])
20
+ p2 = create(:menu, roles: [ur])
21
+ p3 = create(:menu)
22
+
23
+ 3.times { create(:menu, parent: p1, roles: [ur]) }
24
+ 3.times { create(:menu, parent: p2, roles: [ur]) }
25
+ 3.times { create(:menu, parent: p3) }
26
+
27
+ get :menus, params: { id: user.id, app_module: m.code }
28
+ result = JSON(response.body)
29
+ expect(result['data'].count).to eq 2
30
+ end
31
+
32
+ it 'gets menus only for the current application module' do
33
+ m1 = create(:application_module)
34
+ m2 = create(:application_module)
35
+ ur1 = create(:user_role, application_module: m1)
36
+ ur2 = create(:user_role, application_module: m2)
37
+
38
+ menu1 = create(:menu, application_module: m1, roles: [ur1])
39
+ menu2 = create(:menu, application_module: m1, roles: [ur1])
40
+ menu3 = create(:menu, application_module: m2, roles: [ur2])
41
+ menu4 = create(:menu, application_module: m2, roles: [ur2])
42
+
43
+ u = create(:user, roles: [ur1, ur2], application_modules: [m1, m2])
44
+
45
+ get :menus, params: { id: u.id, app_module: m1.code }
46
+ result = JSON(response.body)
47
+ expect(result['data'].count).to eq 2
48
+ # expect(result['data'])
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,130 @@
1
+ require 'rails_helper'
2
+
3
+ module Mks
4
+ module Auth
5
+ RSpec.describe UserRolesController, type: :controller do
6
+ routes { Mks::Auth::Engine.routes }
7
+
8
+ before(:each) do
9
+ u = create(:user)
10
+ token = Mks::Auth::TokenAuth.issue(name: u.full_name, email: u.email, id: u.id)
11
+ request.headers['Authorization'] = "Bearer #{token}"
12
+ end
13
+
14
+ describe 'GET #index' do
15
+ it 'returns only roles of the application module' do
16
+ app_module = create(:application_module, code: 'DUMMY')
17
+ 3.times { create(:user_role, application_module: app_module) }
18
+ create(:user_role)
19
+
20
+ get :index
21
+
22
+ result = JSON(response.body)
23
+ expect(result['data'].count).to eq 3
24
+ end
25
+ end
26
+
27
+ describe 'GET #users' do
28
+ it 'fetches users of a role' do
29
+ r1 = create(:user_role)
30
+ r2 = create(:user_role)
31
+
32
+ u1 = create(:user, roles: [r1])
33
+ u2 = create(:user, roles: [r1, r2])
34
+ u3 = create(:user, roles: [r1, r2])
35
+ create(:user, roles: [r2])
36
+
37
+ get :users, params: { id: r1.id }
38
+
39
+ result = JSON(response.body)
40
+ data = result['data']
41
+ users = [JSON(u1.to_json), JSON(u2.to_json), JSON(u3.to_json)]
42
+ expect(data.count).to eq 3
43
+ expect((users - data).empty?).to be_truthy
44
+ end
45
+ end
46
+
47
+ describe 'GET #assigned_roles' do
48
+ it 'gets all roles with assigned ones as selected for a user' do
49
+ app_module = create(:application_module, code: 'DUMMY')
50
+ ur1 = create(:user_role, application_module: app_module)
51
+ ur2 = create(:user_role, application_module: app_module)
52
+ create(:user_role, application_module: app_module)
53
+
54
+ 3.times { create(:user_role) }
55
+ user = create(:user, roles: [ur1, ur2])
56
+
57
+ get :assigned_roles, params: { id: user.id }
58
+
59
+ result = JSON(response.body)
60
+ expect(result['data'].count).to eq 3
61
+ selected = result['data'].select { |d| (d['selected'])}
62
+ unselected = result['data'].reject { |d| (d['selected'])}
63
+
64
+ expect(selected.count).to eq 2
65
+ expect(unselected.count).to eq 1
66
+ end
67
+ end
68
+
69
+ describe 'POST #assign_roles' do
70
+ it 'assigns roles to a user' do
71
+ app_module = create(:application_module, code: 'DUMMY')
72
+ ur1 = create(:user_role, application_module: app_module)
73
+ ur2 = create(:user_role, application_module: app_module)
74
+ create(:user_role, application_module: app_module)
75
+
76
+ u = create(:user)
77
+ u.application_modules = [app_module]
78
+
79
+ payload = [
80
+ { id: ur1.id, selected: true },
81
+ { id: ur2.id, selected: true }
82
+ ]
83
+
84
+ post :assign_roles, params: { id: u.id, roles: payload }, format: :json
85
+ result = JSON(response.body)
86
+ expect(result['success']).to be_truthy
87
+ u.reload
88
+ expect(u.roles.count).to eq 2
89
+
90
+ end
91
+
92
+ it 'assigns only selected roles' do
93
+ app_module = create(:application_module, code: 'DUMMY')
94
+ ur1 = create(:user_role, application_module: app_module)
95
+ ur2 = create(:user_role, application_module: app_module)
96
+ ur3 = create(:user_role, application_module: app_module)
97
+
98
+ u = create(:user, roles: [ur1, ur2], application_modules: [app_module])
99
+
100
+ payload = [
101
+ { id: ur1.id, selected: true },
102
+ { id: ur3.id, selected: true }
103
+ ]
104
+
105
+ post :assign_roles, params: { id: u.id, roles: payload }, format: :json
106
+ result = JSON(response.body)
107
+ expect(result['success']).to be_truthy
108
+ u.reload
109
+ expect(u.roles.count).to eq 2
110
+ expect(u.roles).to include ur1
111
+ expect(u.roles).to include ur3
112
+ end
113
+
114
+ it 'removes roles if unselected' do
115
+ app_module = create(:application_module, code: 'DUMMY')
116
+ ur1 = create(:user_role, application_module: app_module)
117
+ ur2 = create(:user_role, application_module: app_module)
118
+
119
+ u = create(:user, roles: [ur1, ur2], application_modules: [app_module])
120
+
121
+ post :assign_roles, params: { id: u.id, roles: [] }, format: :json
122
+ result = JSON(response.body)
123
+ expect(result['success']).to be_truthy
124
+ u.reload
125
+ expect(u.roles.count).to eq 0
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -1,4 +1,5 @@
1
1
  require 'rails_helper'
2
+ require 'mks/auth/token_auth'
2
3
 
3
4
  module Mks
4
5
  module Auth
@@ -8,13 +9,78 @@ module Mks
8
9
  describe 'GET #roles' do
9
10
  it 'gets roles of a user' do
10
11
  u = create(:user)
12
+ token = Mks::Auth::TokenAuth.issue(name: u.full_name, email: u.email, id: u.id)
13
+ request.headers['Authorization'] = "Bearer #{token}"
14
+
11
15
  roles = [create(:user_role), create(:user_role)]
12
16
  u.roles << roles
13
- get :roles, session: { user_id: u.id }
17
+ get :roles, params: { id: u.id }
14
18
  result = JSON(response.body)
15
19
  expect(result['data'].count).to eq 2
16
20
  end
17
21
  end
22
+
23
+ describe 'GET #user_roles' do
24
+ it 'fetches roles' do
25
+ app_module = create(:application_module, code: 'DUMMY')
26
+ u = create(:user, application_modules: [app_module])
27
+ token = Mks::Auth::TokenAuth.issue(name: u.full_name, email: u.email, id: u.id)
28
+ request.headers['Authorization'] = "Bearer #{token}"
29
+
30
+ r1 = create(:user_role, application_module: app_module)
31
+ r2 = create(:user_role, application_module: app_module)
32
+ u.roles << r1
33
+
34
+ get :user_roles, params: { id: u.id }
35
+ result = JSON(response.body)
36
+ expect(result.count).to eq 2
37
+ expect(result.select { |r| r['id'] == r1.id }[0]['selected']).to be_truthy
38
+ expect(result.select { |r| r['id'] == r2.id }[0]['selected']).to be_falsey
39
+ end
40
+ end
41
+
42
+ describe 'POST #save_selected_roles' do
43
+ it 'saves selected user roles' do
44
+ app_module = create(:application_module, code: 'DUMMY')
45
+ u = create(:user, application_modules: [app_module])
46
+ token = Mks::Auth::TokenAuth.issue(name: u.full_name, email: u.email, id: u.id)
47
+ request.headers['Authorization'] = "Bearer #{token}"
48
+
49
+ r1 = create(:user_role, application_module: app_module)
50
+ r2 = create(:user_role, application_module: app_module)
51
+
52
+ roles = [
53
+ { id: r1.id, selected: true },
54
+ { id: r2.id, selected: true }
55
+ ]
56
+
57
+ post :save_selected_roles, params: { id: u.id, roles: roles }
58
+ u.reload
59
+ expect(u.roles.count).to eq 2
60
+ end
61
+ end
62
+
63
+ describe 'POST #login' do
64
+ it 'returns a jwt token for correct credentials' do
65
+ m = create(:application_module)
66
+ ur = create(:user_role, application_module: m)
67
+ u = create(:user, password: '123456', password_confirmation: '123456', roles: [ur], application_modules: [m])
68
+ auth = { email: u.email, password: '123456', app_module: m.code }
69
+ token = Mks::Auth::TokenAuth.issue(u.to_token_payload)
70
+ post :login, params: { auth: auth }
71
+
72
+ result = JSON(response.body)
73
+ expect(result['jwt']).to eq token
74
+ end
75
+
76
+ it 'returns a 401 status for failed logins' do
77
+ u = create(:user)
78
+ auth = { email: u.email, password: '123456' }
79
+ post :login, params: { auth: auth }
80
+
81
+ expect(response.status).to eq 400
82
+ end
83
+ end
18
84
  end
19
85
  end
20
86
  end
@@ -15,6 +15,8 @@ require "mks_auth"
15
15
 
16
16
  module Dummy
17
17
  class Application < Rails::Application
18
+ config.auth_secret = '31a70abfaa57e5e77a3fc9f27aeaaf59b9a9f5355b5e16c842ee172035a8ed40bf82c1c971ecc176e4f0b4c9e6141db07fd4a5af3f7db9265e719fbe340b105a'
19
+ config.app_code = 'DUMMY'
18
20
  # Settings in config/environments/* take precedence over those specified here.
19
21
  # Application configuration should go into files in config/initializers
20
22
  # -- all .rb files in that directory are automatically loaded.
@@ -6,18 +6,20 @@
6
6
  #
7
7
  default: &default
8
8
  adapter: postgresql
9
+ host: localhost
10
+ port: 5433
9
11
  pool: 5
10
12
  timeout: 5000
11
- user: henock
13
+ user: postgres
12
14
  pass:
13
15
 
14
16
  development:
15
17
  <<: *default
16
- database: logistics_development
18
+ database: construction_development
17
19
 
18
20
  # Warning: The database defined as "test" will be erased and
19
21
  # re-generated from your development database when you run "rake".
20
22
  # Do not set this db to the same as development or production.
21
23
  test:
22
24
  <<: *default
23
- database: logistics_test
25
+ database: construction_test
@@ -18,7 +18,7 @@ ActiveSupport.to_time_preserves_timezone = true
18
18
  Rails.application.config.active_record.belongs_to_required_by_default = true
19
19
 
20
20
  # Do not halt callback chains when a callback returns false. Previous versions had true.
21
- ActiveSupport.halt_callback_chains_on_return_false = false
21
+ # ActiveSupport.halt_callback_chains_on_return_false = false
22
22
 
23
23
  # Configure SSL options to enable HSTS with subdomains. Previous versions had false.
24
24
  Rails.application.config.ssl_options = { hsts: { subdomains: true } }
@@ -10,66 +10,74 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(version: 20161029074023) do
13
+ ActiveRecord::Schema.define(version: 2018_02_01_104912) do
14
14
 
15
15
  # These are extensions that must be enabled in order to support this database
16
16
  enable_extension "plpgsql"
17
17
 
18
18
  create_table "mks_auth_application_modules", force: :cascade do |t|
19
- t.string "code", null: false
20
- t.string "name", null: false
19
+ t.string "code", null: false
20
+ t.string "name", null: false
21
21
  t.datetime "created_at", null: false
22
22
  t.datetime "updated_at", null: false
23
23
  end
24
24
 
25
25
  create_table "mks_auth_menus", force: :cascade do |t|
26
- t.string "text", null: false
27
- t.string "icon_cls"
28
- t.string "class_name"
29
- t.string "location"
30
- t.integer "parent_id"
31
- t.integer "application_module_id"
32
- t.datetime "created_at", null: false
33
- t.datetime "updated_at", null: false
34
- t.index ["application_module_id"], name: "index_mks_auth_menus_on_application_module_id", using: :btree
35
- t.index ["parent_id"], name: "index_mks_auth_menus_on_parent_id", using: :btree
26
+ t.string "text", null: false
27
+ t.string "icon_cls"
28
+ t.string "class_name"
29
+ t.string "location"
30
+ t.integer "parent_id"
31
+ t.bigint "application_module_id"
32
+ t.datetime "created_at", null: false
33
+ t.datetime "updated_at", null: false
34
+ t.index ["application_module_id"], name: "index_mks_auth_menus_on_application_module_id"
35
+ t.index ["parent_id"], name: "index_mks_auth_menus_on_parent_id"
36
36
  end
37
37
 
38
38
  create_table "mks_auth_menus_user_roles", force: :cascade do |t|
39
- t.integer "menu_id"
40
- t.integer "user_role_id"
41
- t.index ["menu_id", "user_role_id"], name: "index_mks_auth_menus_user_roles_on_menu_id_and_user_role_id", using: :btree
39
+ t.bigint "menu_id"
40
+ t.bigint "user_role_id"
41
+ t.index ["menu_id", "user_role_id"], name: "index_mks_auth_menus_user_roles_on_menu_id_and_user_role_id"
42
42
  end
43
43
 
44
44
  create_table "mks_auth_user_roles", force: :cascade do |t|
45
- t.string "name", null: false
45
+ t.string "name", null: false
46
+ t.bigint "application_module_id"
46
47
  t.datetime "created_at", null: false
47
48
  t.datetime "updated_at", null: false
49
+ t.index ["application_module_id"], name: "index_mks_auth_user_roles_on_application_module_id"
48
50
  end
49
51
 
50
52
  create_table "mks_auth_users", force: :cascade do |t|
51
- t.string "first_name", null: false
52
- t.string "last_name", null: false
53
- t.string "email", null: false
54
- t.boolean "active", default: true, null: false
55
- t.integer "application_module_id"
56
- t.string "password_digest"
57
- t.datetime "created_at", null: false
58
- t.datetime "updated_at", null: false
59
- t.index ["application_module_id"], name: "index_mks_auth_users_on_application_module_id", using: :btree
53
+ t.string "first_name", null: false
54
+ t.string "last_name", null: false
55
+ t.string "email", null: false
56
+ t.boolean "active", default: true, null: false
57
+ t.string "password_digest"
58
+ t.datetime "created_at", null: false
59
+ t.datetime "updated_at", null: false
60
+ end
61
+
62
+ create_table "mks_auth_users_application_modules", id: false, force: :cascade do |t|
63
+ t.bigint "user_id"
64
+ t.bigint "application_module_id"
65
+ t.index ["user_id", "application_module_id"], name: "am_on_users_indx"
60
66
  end
61
67
 
62
68
  create_table "mks_auth_users_user_roles", id: false, force: :cascade do |t|
63
- t.integer "user_id"
64
- t.integer "user_role_id"
65
- t.index ["user_id", "user_role_id"], name: "index_mks_auth_users_user_roles_on_user_id_and_user_role_id", using: :btree
69
+ t.bigint "user_id"
70
+ t.bigint "user_role_id"
71
+ t.index ["user_id", "user_role_id"], name: "index_mks_auth_users_user_roles_on_user_id_and_user_role_id"
66
72
  end
67
73
 
68
74
  add_foreign_key "mks_auth_menus", "mks_auth_application_modules", column: "application_module_id"
69
75
  add_foreign_key "mks_auth_menus", "mks_auth_menus", column: "parent_id"
70
76
  add_foreign_key "mks_auth_menus_user_roles", "mks_auth_menus", column: "menu_id"
71
77
  add_foreign_key "mks_auth_menus_user_roles", "mks_auth_user_roles", column: "user_role_id"
72
- add_foreign_key "mks_auth_users", "mks_auth_application_modules", column: "application_module_id"
78
+ add_foreign_key "mks_auth_user_roles", "mks_auth_application_modules", column: "application_module_id"
79
+ add_foreign_key "mks_auth_users_application_modules", "mks_auth_application_modules", column: "application_module_id"
80
+ add_foreign_key "mks_auth_users_application_modules", "mks_auth_users", column: "user_id"
73
81
  add_foreign_key "mks_auth_users_user_roles", "mks_auth_user_roles", column: "user_role_id"
74
82
  add_foreign_key "mks_auth_users_user_roles", "mks_auth_users", column: "user_id"
75
83
  end