mks_auth 1.0.10 → 1.2.0

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/mks/auth/access_controller.rb +51 -0
  3. data/app/controllers/mks/auth/application_controller.rb +13 -40
  4. data/app/controllers/mks/auth/application_modules_controller.rb +2 -0
  5. data/app/controllers/mks/auth/user_roles_controller.rb +32 -40
  6. data/app/controllers/mks/auth/users_controller.rb +29 -47
  7. data/app/helpers/mks/auth/access_helper.rb +47 -0
  8. data/app/helpers/mks/auth/application_helper.rb +10 -0
  9. data/app/models/mks/auth/application_module.rb +3 -3
  10. data/app/models/mks/auth/menu.rb +5 -5
  11. data/app/models/mks/auth/user.rb +8 -30
  12. data/app/models/mks/auth/user_role.rb +5 -10
  13. data/config/routes.rb +18 -17
  14. data/db/migrate/20161029065810_create_mks_auth_application_modules.rb +1 -1
  15. data/db/migrate/20161029065959_create_mks_auth_users.rb +4 -1
  16. data/db/migrate/20161029070807_create_mks_auth_user_roles.rb +2 -3
  17. data/db/migrate/20161029071047_create_mks_users_user_roles.rb +4 -4
  18. data/db/migrate/20161029072256_create_mks_auth_menus.rb +3 -3
  19. data/db/migrate/20161029074023_create_mks_menus_user_roles.rb +3 -3
  20. data/lib/mks/auth/engine.rb +12 -5
  21. data/lib/mks/auth/version.rb +1 -1
  22. data/lib/mks_auth.rb +0 -1
  23. data/spec/controllers/mks/auth/users_controller_spec.rb +2 -91
  24. data/spec/dummy/config/application.rb +0 -2
  25. data/spec/dummy/config/database.yml +3 -5
  26. data/spec/dummy/config/initializers/new_framework_defaults.rb +1 -1
  27. data/spec/dummy/db/schema.rb +30 -38
  28. data/spec/factories/application_modules.rb +1 -1
  29. data/spec/factories/menus.rb +1 -1
  30. data/spec/factories/user_roles.rb +1 -2
  31. data/spec/factories/users.rb +2 -1
  32. data/spec/models/mks/auth/application_module_spec.rb +1 -2
  33. data/spec/models/mks/auth/user_role_spec.rb +0 -6
  34. data/spec/models/mks/auth/user_spec.rb +0 -21
  35. data/spec/rails_helper.rb +0 -1
  36. data/spec/spec_helper.rb +1 -1
  37. data/spec/support/factory_girl.rb +2 -2
  38. metadata +69 -92
  39. data/app/controllers/mks/auth/menus_controller.rb +0 -29
  40. data/db/migrate/20180201104912_create_mks_users_application_modules.rb +0 -12
  41. data/lib/mks/auth/token_auth.rb +0 -19
  42. data/spec/controllers/mks/auth/menus_controller_spec.rb +0 -53
  43. data/spec/controllers/mks/auth/user_roles_controller_spec.rb +0 -129
  44. data/spec/dummy/log/development.log +0 -14612
  45. data/spec/dummy/log/test.log +0 -44921
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 37056ea18a622827ae2f1f1bc944679a3529f7ed4714d4c5e4d56ea7196bab92
4
- data.tar.gz: 8fd18dabcc6233261a5102213f4f62fd5b6ac24c090a022af619210ec0ea2a08
3
+ metadata.gz: c9befc13ee79dba3fce47aa04621b0cbab4983d6f32e22eefa8f8ea038dc0235
4
+ data.tar.gz: 8799d30c67e91c2f773bae8715e17a6b17bbf2fcff1bb1a232761955f142778a
5
5
  SHA512:
6
- metadata.gz: 8442d29bb5de7a3f644de5317a389ffcc5b1883aaec660a5233fc287c7db5ce806eec1dec0cea70928a86ec9e866f4ac5938c849b11a5fc9932d539ba43952f9
7
- data.tar.gz: '0870f56b73db021b3dc09da9439c51d7d7979aca3c7db1b615adc15af7edf5ad741674e40eb31102edc4606a8f29399fc9b21eb55177d9076b3669d58005cec0'
6
+ metadata.gz: bded2f7264869bf5dfb2437d39f5e6c5950a1c949c9effc36522fc547f40299dabb9e9e72b87a7f852af39f4daf7f4e3bd6b0ad2a0f5cbe02a278b190eb21e70
7
+ data.tar.gz: 510531747665163e392c2593ce3f9815c506d7555347a7e2a20da552954b803bf7cbd0aa7a2bcbbab34242a062d99cc5f29ba9b236c89b00cd031e8882a81a17
@@ -0,0 +1,51 @@
1
+ require_dependency 'mks/auth/application_controller'
2
+
3
+ module Mks
4
+ module Auth
5
+ class AccessController < ApplicationController
6
+ before_action :confirm_logged_in, :except => [:attempt_login, :logout, :menu, :csrf_token]
7
+
8
+ def csrf_token
9
+ cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
10
+ render json: {success: true}
11
+ end
12
+
13
+ def attempt_login
14
+ code = Rails.configuration.app_code
15
+ app_module = ApplicationModule.find_by(code: code)
16
+ user = User.find_by(email: params[:email].downcase)
17
+
18
+ if user && user.application_module.id == app_module.id
19
+ if user.authenticate(params[:password])
20
+ login_user user
21
+ roles = user.roles.map(&:name)
22
+ response = { success: true, data: {user_id: user.id, user_full_name: user.full_name, roles: roles }}
23
+ render json: response
24
+ else
25
+ render json: {success: false, errors: "Invalid username or password"}
26
+ end
27
+ else
28
+ render json: {success: false, errors: "User doesn't exist or is not allowed!"}
29
+ end
30
+ end
31
+
32
+ def logout
33
+ logout_user if logged_in?
34
+ render json: { success: true }
35
+ end
36
+
37
+ def menu
38
+ render json: {success: true, data: fetch_menus}
39
+ end
40
+
41
+ def check_login
42
+ if session[:user_id]
43
+ user = User.find(session[:user_id])
44
+ render json: {success: true, data: user.full_name}
45
+ else
46
+ render json: {success: false}
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,51 +1,24 @@
1
- require 'mks/auth/token_auth'
2
- require 'mks/common/methodresponse'
3
-
4
1
  module Mks
5
2
  module Auth
6
- class ApplicationController < ActionController::API
7
- before_action :authenticate
8
-
9
- def logged_in?
10
- !current_user.nil?
11
- end
12
-
13
- def current_user
14
- return unless auth_present?
15
- user = User.find(auth['id'])
16
- @current_user ||= user if user
17
- end
18
-
19
- def current_user_id
20
- auth['id']
21
- end
22
-
23
- def app_code
24
- Rails.application.config.app_code
25
- end
3
+ class ApplicationController < ActionController::Base
4
+ include AccessHelper
5
+ include ApplicationHelper
26
6
 
27
7
  private
28
8
 
29
- def authenticate
30
- render json: { error: 'Unauthorized' }, status: 401 unless logged_in?
31
- end
32
-
33
- def token
34
- request.env['HTTP_AUTHORIZATION'].scan(/Bearer (.*)$/).flatten.last
9
+ def confirm_logged_in
10
+ if session[:user_id]
11
+ true
12
+ else
13
+ redirect_to '/'
14
+ false
15
+ end
35
16
  end
36
17
 
37
- def auth
38
- TokenAuth.decode(token)
39
- end
40
-
41
- def auth_present?
42
- bearer = request.env.fetch('HTTP_AUTHORIZATION', '').scan(/Bearer/).flatten.first
43
- !bearer.nil?
44
- end
18
+ protected
45
19
 
46
- def app_module
47
- code = Rails.configuration.app_code
48
- ApplicationModule.find_by(code: code)
20
+ def verified_request?
21
+ super || valid_authenticity_token?(session, request.headers['X-XSRF-TOKEN'])
49
22
  end
50
23
  end
51
24
  end
@@ -1,3 +1,5 @@
1
+ require_dependency 'mks/auth/application_controller'
2
+
1
3
  module Mks
2
4
  module Auth
3
5
  class ApplicationModulesController < ApplicationController
@@ -1,59 +1,51 @@
1
+ require_dependency 'mks/auth/application_controller'
2
+
1
3
  module Mks
2
4
  module Auth
3
5
  class UserRolesController < ApplicationController
4
- before_action :set_role, only: %i[users]
5
- before_action :set_user, only: %i[assigned_roles assign_roles]
6
+ # before_action :confirm_logged_in
6
7
 
7
8
  # GET /user_roles
8
9
  def index
9
- user_roles = UserRole.joins(:application_module)
10
- .where("mks_auth_application_modules.code = '#{app_code}'")
11
- .order(:name)
12
- render json: user_roles
13
- end
14
-
15
- def users
16
- render json: @role.users
10
+ @user_roles = UserRole.all.order(:name)
11
+ response = { success: true, data: @user_roles }
12
+ render json: response
17
13
  end
18
14
 
19
- def assigned_roles
20
- selected = @user.roles.map { |ur| { id: ur.id, name: ur.name, selected: true }}
21
- ids = @user.roles.map(&:id)
22
- user_roles = UserRole.joins(:application_module)
23
- .where("mks_auth_application_modules.code = '#{app_code}'")
24
- .where.not('mks_auth_user_roles.id IN (?)', ids)
25
-
26
- not_selected = user_roles.map { |ur| { id: ur.id, name: ur.name, selected: false }}
27
- data = (selected + not_selected).sort_by{ |r| r[:name] }
28
-
15
+ def get_assigned_roles
16
+ user = User.find(params[:user_id])
17
+ user_roles = UserRole.all.order(:name)
18
+ data = []
19
+ user_roles.each do |user_role|
20
+ item = {id: user_role.id, name: user_role.name}
21
+ if user.roles.include? user_role
22
+ item[:selected] = true
23
+ else
24
+ item[:selected] = false
25
+ end
26
+ data << item
27
+ end
29
28
  response = { success: true, data: data }
30
29
  render json: response
31
30
  end
32
31
 
33
- # A method which assigns selected roles to a user.
34
- # This method expects that only selected roles
35
- # (i.e. roles with `selected` attribute set to true).
36
- # It removes all other roles and assigns those selected
37
- # roles to the user.
38
32
  def assign_roles
39
- selected_roles = params[:roles]&.map { |r| r[:id] }
40
- user_roles = UserRole.where(id: selected_roles)
41
- @user.roles.destroy_all
42
- @user.roles = user_roles
43
-
44
- response = { success: true, message: 'Role assignment successful!' }
45
- render json: response
46
- end
33
+ user = User.find(params[:user_id])
34
+ roles = params[:roles]
47
35
 
36
+ roles.each do |role|
37
+ user_role = UserRole.find role[:id]
38
+ if role[:selected]
39
+ user.roles << user_role
40
+ else
41
+ user.roles.destroy user_role
42
+ end
43
+ end
48
44
 
49
- private
45
+ user.save
50
46
 
51
- def set_role
52
- @role = UserRole.find(params[:id])
53
- end
54
-
55
- def set_user
56
- @user = User.find(params[:id])
47
+ response = { success: true, message: 'Role assignment successful!' }
48
+ render json: response
57
49
  end
58
50
  end
59
51
  end
@@ -1,68 +1,58 @@
1
+ require_dependency 'mks/auth/application_controller'
2
+
1
3
  module Mks
2
4
  module Auth
3
5
  class UsersController < ApplicationController
4
- skip_before_action :authenticate, raise: false, only: %i[login]
5
- before_action :set_user, only: %i[update user_roles save_selected_roles]
6
+ before_action :set_user, only: [:update]
6
7
 
7
8
  def index
8
- @users = ApplicationModule.find_by(code: app_code).users
9
- render json: @users
9
+ @users = User.where(application_module_id: app_module.id)
10
+ response = { success: true, data: @users }
11
+ render json: response
10
12
  end
11
13
 
12
14
  def roles
13
- user = User.find(params[:id])
14
- render json: user.roles
15
- end
16
-
17
- # A method to fetch all roles, with roles of
18
- # a user marked as selected
19
- def user_roles
20
- all_roles = UserRole.joins(:application_module).where(mks_auth_application_modules: { code: app_code })
21
- roles = all_roles.map { |r| { id: r.id, name: r.name, selected: @user.roles.include?(r) } }
22
- render json: roles
15
+ user = User.find(session[:user_id])
16
+ data = user.roles.map { |role| {id: role.id, name: role.name} }
17
+ response = {success: true, data: data}
18
+ render json: response
23
19
  end
24
20
 
25
- def save_selected_roles
26
- @user.roles.delete_all
27
- selected = save_selected_roles_params['roles'].select { |r| r['selected'] }.map{ |r| r['id'] }
28
- roles = UserRole.where(id: selected)
29
- @user.roles << roles
30
- render json: { success: true }
21
+ def fetch_by_role
22
+ r = params[:role]
23
+ role = UserRole.find_by(name: r)
24
+ unless role
25
+ raise 'Role not found'
26
+ end
27
+ response = { success: true, data: role.users }
28
+ render json: response
31
29
  end
32
30
 
33
31
  def create
34
32
  @user = User.new(user_params)
35
- app_module = ApplicationModule.find_by(code: app_code)
36
- @user.application_modules = [app_module]
33
+ @user.application_module_id = app_module.id
37
34
  if @user.save
38
- render json: Mks::Common::MethodResponse.success_response(@user)
35
+ response = { success: true, message: 'User saved successfully' }
36
+ render json: response
39
37
  else
40
- render json: Mks::Common::MethodResponse.failure_response(@user), status: :uprocessable_entity
38
+ errors = Mks::Common::Util.error_messages @user, 'User'
39
+ response = { success: false, errors: errors }
40
+ render json: response
41
41
  end
42
42
  end
43
43
 
44
44
  def update
45
45
  if @user.update(user_params)
46
- render json: Mks::Common::MethodResponse.success_response(@user)
47
- else
48
- render json: Mks::Common::MethodResponse.failure_response(@user), status: :unprocessable_entity
49
- end
50
- end
51
-
52
- def login
53
- user = User.find_by(email: auth_params[:email])
54
- if user.authenticate(auth_params[:password]) &&
55
- user.has_module(auth_params[:app_module])
56
-
57
- jwt = TokenAuth.issue(user.to_token_payload)
58
- render json: { jwt: jwt }
46
+ response = { success: true, message: 'User updated successfully' }
47
+ render json: response
59
48
  else
60
- render json: {}, status: 400
49
+ errors = Mks::Common::Util.error_messages @user, 'User'
50
+ response = { success: false, errors: errors }
51
+ render json: response
61
52
  end
62
53
  end
63
54
 
64
55
  private
65
-
66
56
  # Use callbacks to share common setup or constraints between actions.
67
57
  def set_user
68
58
  @user = User.find(params[:id])
@@ -72,14 +62,6 @@ module Mks
72
62
  def user_params
73
63
  params.require(:user).permit(:first_name, :last_name, :email, :password)
74
64
  end
75
-
76
- def auth_params
77
- params.require(:auth).permit(:email, :password, :app_module)
78
- end
79
-
80
- def save_selected_roles_params
81
- params.permit(roles: %i[id selected])
82
- end
83
65
  end
84
66
  end
85
67
  end
@@ -0,0 +1,47 @@
1
+ module Mks
2
+ module Auth
3
+ module AccessHelper
4
+ def login_user(user)
5
+ session[:user_id] = user.id
6
+ end
7
+
8
+ def current_user
9
+ @current_user ||= User.find_by(id: session[:user_id])
10
+ end
11
+
12
+ def logged_in?
13
+ !current_user.nil?
14
+ end
15
+
16
+ def logout_user
17
+ session.delete(:user_id)
18
+ @current_user = nil
19
+ @menus = nil
20
+ end
21
+
22
+ def fetch_menus
23
+ if @menus.nil?
24
+ roles = current_user.roles
25
+ app_module = current_user.application_module
26
+
27
+ @menus = []
28
+ roles.each do |role|
29
+ if role
30
+ menu_list = role.menus.where(:parent => nil, :application_module => app_module)
31
+ menu_list.each do |menu|
32
+ children = []
33
+ menu.children.order(:text).each do |child|
34
+ if child.roles.include? role
35
+ children << {'text': child.text, 'className': child.class_name, 'iconCls': child.icon_cls}
36
+ end
37
+ end
38
+ @menus << {'text': menu.text, 'children': children, 'iconCls': menu.icon_cls}
39
+ end
40
+ end
41
+ end
42
+ end
43
+ @menus
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,10 @@
1
+ module Mks
2
+ module Auth
3
+ module ApplicationHelper
4
+ def app_module
5
+ code = Rails.configuration.app_code
6
+ ApplicationModule.find_by(code: code)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,12 +1,12 @@
1
1
  module Mks
2
2
  module Auth
3
- # A model class to represent applications / modules
4
3
  class ApplicationModule < ApplicationRecord
4
+ #self.table_name = 'mks_application_modules'
5
+
5
6
  validates :code, presence: true
6
7
  validates :code, presence: true, uniqueness: true
7
8
 
8
- has_and_belongs_to_many :users, class_name: 'Mks::Auth::User',
9
- join_table: 'mks_auth_users_application_modules'
9
+ has_many :users, class_name: 'Mks::Auth::User'
10
10
  has_many :menus, class_name: 'Mks::Auth::Menu'
11
11
  end
12
12
  end
@@ -1,12 +1,12 @@
1
1
  module Mks
2
2
  module Auth
3
- # A model class to represent menu items of a module
4
3
  class Menu < ApplicationRecord
4
+ # self.table_name = 'mks_menus'
5
+
5
6
  belongs_to :application_module, class_name: 'Mks::Auth::ApplicationModule'
6
7
  belongs_to :parent, class_name: 'Mks::Auth::Menu', optional: true
7
- has_many :children, class_name: 'Mks::Auth::Menu', foreign_key: 'parent_id'
8
- has_and_belongs_to_many :roles, class_name: 'Mks::Auth::UserRole',
9
- join_table: 'mks_auth_menus_user_roles'
8
+ has_many :children, class_name: 'Mks::Auth::Menu', :foreign_key => 'parent_id'
9
+ has_and_belongs_to_many :roles, class_name: 'Mks::Auth::UserRole', :join_table => :mks_auth_menus_user_roles
10
10
  end
11
11
  end
12
- end
12
+ end
@@ -1,46 +1,24 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Mks
4
2
  module Auth
5
- # A model class to represent users of the system
6
3
  class User < ApplicationRecord
7
- has_and_belongs_to_many :application_modules,
8
- class_name: 'Mks::Auth::ApplicationModule',
9
- join_table: 'mks_auth_users_application_modules'
10
- has_and_belongs_to_many :roles, class_name: 'Mks::Auth::UserRole',
11
- join_table: 'mks_auth_users_user_roles'
4
+ # self.table_name = 'mks_users'
5
+
6
+ belongs_to :application_module, class_name: 'Mks::Auth::ApplicationModule'
7
+ has_and_belongs_to_many :roles, class_name: 'Mks::Auth::UserRole', join_table: :mks_auth_users_user_roles
12
8
  has_secure_password
13
9
 
14
10
  before_save { email.downcase! }
15
11
 
16
12
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
17
- validates :first_name, presence: true, length: { maximum: 30 }
18
- validates :last_name, presence: true, length: { maximum: 30 }
19
- validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
13
+ validates :first_name, presence: true, length: {maximum: 30}
14
+ validates :last_name, presence: true, length: {maximum: 30}
15
+ validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: {case_sensitive: false}
20
16
  validates :password, length: { minimum: 6 }
21
17
  validates :active, presence: true
22
18
 
23
19
  def full_name
24
20
  "#{first_name} #{last_name}"
25
21
  end
26
-
27
- def role_names
28
- roles.map(&:name)
29
- end
30
-
31
- def to_token_payload
32
- { id: id, email: email, name: full_name, roles: role_names }
33
- end
34
-
35
- def has_module(code)
36
- app_module = ApplicationModule.find_by(code: code)
37
- roles = self.roles.select { |ur| ur.application_module == app_module }
38
- roles.count.positive?
39
- end
40
-
41
- def role?(role)
42
- roles.any? { |r| r.name.underscore.to_sym == role }
43
- end
44
22
  end
45
23
  end
46
- end
24
+ end