mks_auth 1.0.11 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) 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 -34
  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 -33
  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 -97
  39. data/app/assets/config/mks_auth_manifest.js +0 -2
  40. data/app/assets/javascripts/mks_auth/application.js +0 -13
  41. data/app/assets/stylesheets/mks_auth/application.css +0 -15
  42. data/app/controllers/mks/auth/menus_controller.rb +0 -29
  43. data/app/jobs/mks_auth/application_job.rb +0 -4
  44. data/app/mailers/mks_auth/application_mailer.rb +0 -6
  45. data/db/migrate/20180201104912_create_mks_users_application_modules.rb +0 -12
  46. data/lib/mks/auth/token_auth.rb +0 -19
  47. data/spec/controllers/mks/auth/menus_controller_spec.rb +0 -53
  48. data/spec/controllers/mks/auth/user_roles_controller_spec.rb +0 -129
  49. data/spec/dummy/log/development.log +0 -14698
  50. data/spec/dummy/log/test.log +0 -45920
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 227d86604956d17a721112c90dad92ee76a7bcffbed19e27a37b3c719d574f71
4
- data.tar.gz: 9ed99b708d3353045f38dc58c5326195cec7d055139ddb2abfef5745e626b59c
3
+ metadata.gz: bb9f3e4044ff6afdd5fb2976a8b9cdbcd2a3eb9140f1c7f21565e912e963ef92
4
+ data.tar.gz: f7d39dedae27d2e95bd7052c5e90dadc679132048d51b4acdf0b914ea2ba36cb
5
5
  SHA512:
6
- metadata.gz: 2a4a520ff71bc5209cf919107bbcac89b72a83cd337cffb56679401c963dd5f397ddaa72161363c3f5b1e44e6af74c2001bc5a3b8c37fa9883ddfc3f4bcbc116
7
- data.tar.gz: 26b064e717abb1629211f1b469d69e09f986aedd67d072ca4332e75673060c464f5692a3df9617870da82cee47285b77972bd3bb9732204b149a80549c700cbb
6
+ metadata.gz: e33d69f6e00b0e8948ad65ed8e25db87654023f69eda3c1e4ba6bc5f30e7297e8a6f33ba13c61d29ffa9eccb78d995e265f81a0b88c9b1f7a30cd2f2ebe94b4a
7
+ data.tar.gz: f4a4465366f78f1087793b00a74741a6a611f01e0a9867ce07fea31ad671ab6cadf2402316eec93edf6c760bbf6a7dc5f55d8f90c926d5c38b53ca9ee9eb09dc
@@ -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,50 +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
-
45
- def any_role?(role_list)
46
- roles.any? { |r| role_list.include?(r.name.underscore.to_sym) }
47
- end
48
22
  end
49
23
  end
50
- end
24
+ end