mks_auth 1.0.0 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
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