auth-assistant 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.DS_Store +0 -0
- data/.document +5 -0
- data/.gitignore +39 -0
- data/Changelog.txt +30 -0
- data/LICENSE +20 -0
- data/README.markdown +308 -0
- data/Rakefile +20 -0
- data/VERSION +1 -0
- data/app/.DS_Store +0 -0
- data/app/views/.DS_Store +0 -0
- data/app/views/auth_assist/menu/_admin_login_items.html.erb +11 -0
- data/app/views/auth_assist/menu/_login_items.html.erb +11 -0
- data/app/views/auth_assist/menu/_registration_items.html.erb +10 -0
- data/auth-assistant.gemspec +115 -0
- data/config/locales/en.yml +14 -0
- data/init.rb +1 -0
- data/lib/.DS_Store +0 -0
- data/lib/auth-assistant.rb +24 -0
- data/lib/auth_assistant/configure.rb +16 -0
- data/lib/auth_assistant/helpers/admin_role.rb +59 -0
- data/lib/auth_assistant/helpers/all.rb +4 -0
- data/lib/auth_assistant/helpers/localhost.rb +22 -0
- data/lib/auth_assistant/helpers/roles.rb +52 -0
- data/lib/auth_assistant/helpers/user_role.rb +47 -0
- data/lib/auth_assistant/model/user_config.rb +42 -0
- data/lib/auth_assistant/role_strategies/admin_field.rb +37 -0
- data/lib/auth_assistant/role_strategies/all.rb +7 -0
- data/lib/auth_assistant/role_strategies/multi_role_assignment.rb +34 -0
- data/lib/auth_assistant/role_strategies/role_assignment.rb +41 -0
- data/lib/auth_assistant/role_strategies/role_field.rb +32 -0
- data/lib/auth_assistant/role_strategies/roles_field.rb +31 -0
- data/lib/auth_assistant/role_strategies/roles_mask.rb +35 -0
- data/lib/auth_assistant/role_strategies/shared.rb +25 -0
- data/lib/auth_assistant/translate/authlabels.rb +23 -0
- data/lib/auth_assistant/view/all.rb +4 -0
- data/lib/auth_assistant/view/auth_menu_item.rb +27 -0
- data/lib/auth_assistant/view/registration_link.rb +30 -0
- data/lib/auth_assistant/view/rest_link.rb +70 -0
- data/lib/auth_assistant/view/session_link.rb +31 -0
- data/lib/generators/.DS_Store +0 -0
- data/lib/generators/auth_assist/.DS_Store +0 -0
- data/lib/generators/auth_assist/clear/clear_generator.rb +30 -0
- data/lib/generators/auth_assist/config/.DS_Store +0 -0
- data/lib/generators/auth_assist/config/config_generator.rb +72 -0
- data/lib/generators/auth_assist/templates/ability.rb +22 -0
- data/lib/generators/auth_assist/templates/auth_assistant.rb +6 -0
- data/lib/generators/auth_assist/templates/permits.rb +91 -0
- data/lib/generators/auth_assist/templates/remove_multi_role_assignments_migration.rb +24 -0
- data/lib/generators/auth_assist/templates/remove_role_assignments_migration.rb +17 -0
- data/lib/generators/auth_assist/templates/role_assignments_migration.rb +14 -0
- data/lib/generators/auth_assist/templates/roles_migration.rb +13 -0
- data/lib/generators/auth_assist/test.rb +40 -0
- data/lib/generators/auth_assist/views/views_generator.rb +66 -0
- data/lib/generators/auth_code_refactor.rb +71 -0
- data/lib/generators/migration_helper.rb +81 -0
- data/lib/generators/reverse_migrations.rb +48 -0
- data/lib/generators/role_migrations.rb +167 -0
- data/lib/permits.rb +92 -0
- data/spec/auth-assistant_spec.rb +7 -0
- data/spec/generators/ability_gen_spec.rb +9 -0
- data/spec/sandbox.rb +9 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +11 -0
- metadata +167 -0
@@ -0,0 +1,7 @@
|
|
1
|
+
require 'auth_assistant/role_strategies/shared'
|
2
|
+
require 'auth_assistant/role_strategies/admin_field'
|
3
|
+
require 'auth_assistant/role_strategies/role_field'
|
4
|
+
require 'auth_assistant/role_strategies/roles_field'
|
5
|
+
require 'auth_assistant/role_strategies/roles_mask'
|
6
|
+
require 'auth_assistant/role_strategies/role_assignment'
|
7
|
+
require 'auth_assistant/role_strategies/multi_role_assignment'
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module AuthAssistant
|
2
|
+
module RoleStrategy
|
3
|
+
module MultiRoleAssignment
|
4
|
+
|
5
|
+
def role?(role)
|
6
|
+
return true if roles && roles.include?(role.to_s)
|
7
|
+
false
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def set_scope
|
12
|
+
scope :with_role, lambda { |role|
|
13
|
+
joins(:roles, :role_assignments).
|
14
|
+
where("role_assigments.user_id == id AND role_assigments.role_id == role.id AND roles.id == ?", role)
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_relationships
|
19
|
+
has_many :role_assignments
|
20
|
+
has_many :roles, :through => :role_assignments
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.included(base)
|
25
|
+
base.extend(ClassMethods)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module AuthAssistant
|
2
|
+
module RoleStrategy
|
3
|
+
module RoleAssignment
|
4
|
+
|
5
|
+
def roles=(*roles)
|
6
|
+
new_role = roles.first.to_s
|
7
|
+
self.role = new_role if CanCan.available_roles.include? new_role
|
8
|
+
end
|
9
|
+
|
10
|
+
def roles
|
11
|
+
[role]
|
12
|
+
end
|
13
|
+
|
14
|
+
def role?(_role)
|
15
|
+
roles.include? _role
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
def set_scope
|
20
|
+
scope :with_role, lambda { |role|
|
21
|
+
joins(:roles).
|
22
|
+
where("user.roles_id = roles.id AND roles.id == ?", role)
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def set_relationships
|
27
|
+
has_many :roles
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.included(base)
|
32
|
+
base.extend(ClassMethods)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module AuthAssistant
|
2
|
+
module RoleStrategy
|
3
|
+
module RoleField
|
4
|
+
|
5
|
+
def roles=(*roles)
|
6
|
+
new_role = roles.first.to_s
|
7
|
+
self.role = new_role if CanCan.available_roles.include? new_role
|
8
|
+
end
|
9
|
+
|
10
|
+
def roles
|
11
|
+
[role]
|
12
|
+
end
|
13
|
+
|
14
|
+
def role?(_role)
|
15
|
+
roles.include? _role
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
def set_scope
|
20
|
+
scope :with_role, lambda { |role|
|
21
|
+
where("role?(#{role})")
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.included(base)
|
27
|
+
base.extend(ClassMethods)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module AuthAssistant
|
2
|
+
module RoleStrategy
|
3
|
+
module RolesField
|
4
|
+
|
5
|
+
def roles=(*roles)
|
6
|
+
self.roles = roles.split(',').reject{|e| (e =~ /^\w+$/) == nil}
|
7
|
+
end
|
8
|
+
|
9
|
+
def roles
|
10
|
+
roles.split(',')
|
11
|
+
end
|
12
|
+
|
13
|
+
def role?(role)
|
14
|
+
roles.include? role.to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
def set_scope
|
19
|
+
scope :with_role, lambda { |role|
|
20
|
+
where("role?(#{role})")
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.included(base)
|
26
|
+
base.extend(ClassMethods)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module AuthAssistant
|
2
|
+
module RoleStrategy
|
3
|
+
module RolesMask
|
4
|
+
|
5
|
+
def roles=(*roles)
|
6
|
+
self.roles_mask = (roles & available_roles).map { |r| calc_index(r) }.sum
|
7
|
+
end
|
8
|
+
|
9
|
+
def roles
|
10
|
+
ROLES.reject { |r| ((roles_mask || 0) & calc_index(r)).zero? }
|
11
|
+
end
|
12
|
+
|
13
|
+
def role?(role)
|
14
|
+
roles.include? role.to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
def set_scope
|
19
|
+
scope :with_role, lambda { |role|
|
20
|
+
where("roles_mask & #{calc_index(role.to_s)} > 0")
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.included(base)
|
26
|
+
base.extend(ClassMethods)
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
def calc_index(r)
|
31
|
+
2**available_roles.index(r)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module AuthAssistant
|
2
|
+
module RoleStrategy
|
3
|
+
module Shared
|
4
|
+
attr_accessor :ability
|
5
|
+
|
6
|
+
def admin?
|
7
|
+
role? 'admin'
|
8
|
+
end
|
9
|
+
|
10
|
+
def has(ability)
|
11
|
+
@ability ||= ability
|
12
|
+
end
|
13
|
+
|
14
|
+
def owns(clazz)
|
15
|
+
return if !ability
|
16
|
+
base ||= RolePermit::Base.new(ability)
|
17
|
+
base.owns(self, clazz)
|
18
|
+
end
|
19
|
+
|
20
|
+
def available_roles
|
21
|
+
AuthAssistant::Model.available_roles
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module AuthAssistant
|
2
|
+
module Helpers
|
3
|
+
module AuthLabel
|
4
|
+
def auth_labels
|
5
|
+
@auth_labels ||= translate_labels
|
6
|
+
end
|
7
|
+
|
8
|
+
def translate_labels
|
9
|
+
ns_actions = 'auth_assistant.actions'
|
10
|
+
labels = {}
|
11
|
+
%w{new edit delete show sign_in sign_out sign_up edit_registration}.each do |action|
|
12
|
+
labels[action.to_sym] = t "#{ns_actions}.#{action}"
|
13
|
+
end
|
14
|
+
labels[:confirm] = t 'auth_assistant.confirm'
|
15
|
+
labels
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.included(base)
|
19
|
+
base.helper_method :auth_labels
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module AuthAssistant
|
2
|
+
module ViewHelpers
|
3
|
+
module AuthMenuItem
|
4
|
+
def sign_out_menu_item
|
5
|
+
"<li>#{sign_out_link}</li>".html_safe if current_user
|
6
|
+
end
|
7
|
+
|
8
|
+
def sign_in_menu_item
|
9
|
+
"<li>#{sign_in_link}</li>".html_safe if !current_user
|
10
|
+
end
|
11
|
+
|
12
|
+
def sign_up_menu_item
|
13
|
+
"<li>#{sign_up_link}</li>".html_safe if !current_user
|
14
|
+
end
|
15
|
+
|
16
|
+
def edit_registration_menu_item
|
17
|
+
"<li>#{edit_registration_link}</li>".html_safe if current_user
|
18
|
+
end
|
19
|
+
|
20
|
+
alias_method :logout_menu_item, :sign_out_menu_item
|
21
|
+
alias_method :login_menu_item, :sign_in_menu_item
|
22
|
+
alias_method :register_menu_item, :sign_up_menu_item
|
23
|
+
alias_method :edit_user_menu_item, :edit_registration_menu_item
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module AuthAssistant
|
2
|
+
module ViewHelpers
|
3
|
+
module RegistrationLink
|
4
|
+
|
5
|
+
def sign_up_link(options = {})
|
6
|
+
label = options[:label] || auth_labels[:sign_up]
|
7
|
+
path = registration_path options[:role]
|
8
|
+
link_to(label, path)
|
9
|
+
end
|
10
|
+
|
11
|
+
def edit_registration_link(options = {})
|
12
|
+
label = options[:label] || auth_labels[:edit_registration]
|
13
|
+
path = edit_registration_path options[:role]
|
14
|
+
link_to(label, path)
|
15
|
+
end
|
16
|
+
|
17
|
+
alias_method :register_link, :sign_up_link
|
18
|
+
alias_method :edit_profile_link, :edit_registration_link
|
19
|
+
|
20
|
+
protected
|
21
|
+
def registration_path(role)
|
22
|
+
role == 'admin' ? new_admin_registration_path : new_user_registration_path
|
23
|
+
end
|
24
|
+
|
25
|
+
def edit_registration_path(role)
|
26
|
+
role == 'admin' ? edit_admin_registration_path : edit_user_registration_path
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module AuthAssistant
|
2
|
+
module ViewHelpers
|
3
|
+
module RestLink
|
4
|
+
def index_link(object, label = nil)
|
5
|
+
label ||= auth_labels[:index]
|
6
|
+
puts object.inspect
|
7
|
+
obj = index_obj(object)
|
8
|
+
puts "index obj: #{obj.inspect}"
|
9
|
+
path = send :"#{obj}_path"
|
10
|
+
link = link_to(label, path) if can?(:read, object)
|
11
|
+
end
|
12
|
+
|
13
|
+
def index_obj(obj)
|
14
|
+
o = case obj
|
15
|
+
when Array
|
16
|
+
obj.first.class
|
17
|
+
when Class
|
18
|
+
obj
|
19
|
+
else
|
20
|
+
obj.class
|
21
|
+
end
|
22
|
+
o.name.pluralize.downcase
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def create_link(object, label = nil)
|
27
|
+
label ||= auth_labels[:new]
|
28
|
+
path = send :"new_#{object.class.to_s.downcase}_path"
|
29
|
+
link = link_to(label, path) if can?(:create, object)
|
30
|
+
end
|
31
|
+
|
32
|
+
def edit_link(object, label = nil)
|
33
|
+
label ||= auth_labels[:edit]
|
34
|
+
link_to(label, [:edit, object]) if can?(:edit, object)
|
35
|
+
end
|
36
|
+
|
37
|
+
def delete_link(object, options = nil)
|
38
|
+
options ||= {:label => auth_labels[:delete], :confirm => auth_labels[:confirm]}
|
39
|
+
case options
|
40
|
+
when String
|
41
|
+
label = options
|
42
|
+
when Hash
|
43
|
+
label = options[:label]
|
44
|
+
confirm_msg = options[:confirm]
|
45
|
+
when Array
|
46
|
+
label = options[0]
|
47
|
+
confirm_msg = options.size > 1 ? options[1] : auth_labels[:confirm]
|
48
|
+
end
|
49
|
+
link_to(label, object, :method => :delete, :confirm => confirm_msg) if can?(:destroy, object)
|
50
|
+
end
|
51
|
+
|
52
|
+
def show_link(object, label = nil)
|
53
|
+
label ||= auth_labels[:show]
|
54
|
+
if can?(:read, object)
|
55
|
+
puts "can read: #{object}"
|
56
|
+
link_to(label, object)
|
57
|
+
else
|
58
|
+
puts "no link"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
alias_method :list_link, :index_link
|
63
|
+
alias_method :new_link, :create_link
|
64
|
+
alias_method :destroy_link, :delete_link
|
65
|
+
alias_method :update_link, :edit_link
|
66
|
+
alias_method :read_link, :show_link
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module AuthAssistant
|
2
|
+
module ViewHelpers
|
3
|
+
module SessionLink
|
4
|
+
def sign_out_link(options = {})
|
5
|
+
label = options[:label] || auth_labels[:sign_out]
|
6
|
+
path = destroy_session_path options[:role]
|
7
|
+
link_to(label, path)
|
8
|
+
end
|
9
|
+
|
10
|
+
def sign_in_link(label, options = {})
|
11
|
+
label = options[:label] || auth_labels[:sign_in]
|
12
|
+
path = create_session_path options[:role]
|
13
|
+
link_to(label, path)
|
14
|
+
end
|
15
|
+
|
16
|
+
alias_method :log_out_link, :sign_out_link
|
17
|
+
alias_method :log_in_link, :sign_in_link
|
18
|
+
|
19
|
+
protected
|
20
|
+
def destroy_session_path(role)
|
21
|
+
return send :"destroy_#{role}_session_path" if role && role != 'user'
|
22
|
+
destroy_user_session_path
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_session_path(role)
|
26
|
+
return send :"new_#{role}_session_path" if role && role != 'user'
|
27
|
+
new_user_session_path # default
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'generators/migration_helper'
|
2
|
+
require 'generators/reverse_migrations'
|
3
|
+
require 'generators/role_migrations'
|
4
|
+
require 'rake'
|
5
|
+
|
6
|
+
module AuthAssist
|
7
|
+
module Generators
|
8
|
+
class ClearGenerator < Rails::Generators::NamedBase
|
9
|
+
|
10
|
+
desc "Clears the rails project from any artifacts generated by auth_assist"
|
11
|
+
|
12
|
+
class_option :migration, :type => :boolean, :aliases => "-m", :default => true,
|
13
|
+
:desc => "To generate a migration to clear the user role."
|
14
|
+
|
15
|
+
def self.source_root
|
16
|
+
@source_root ||= File.expand_path("../../templates", __FILE__)
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate_clear_migration
|
20
|
+
return nil if !options[:migration]
|
21
|
+
clazz = AuthAssist::RoleMigrations.clazz(name)
|
22
|
+
obj = clazz.new(self)
|
23
|
+
obj.generate_reverse_migration
|
24
|
+
obj.reverse_configure if obj.respond_to? :reverse_configure
|
25
|
+
end
|
26
|
+
|
27
|
+
include ::AuthAssist::MigrationHelper
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
Binary file
|