pipa-authmagic 0.0.9 → 0.1

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.
@@ -2,4 +2,6 @@ module Authmagic::Modules
2
2
  autoload :ApplicationFramework, 'authmagic/rails/modules/application_framework'
3
3
  autoload :LoginPassword, 'authmagic/rails/modules/login_password'
4
4
  autoload :Authorization, 'authmagic/rails/modules/authorization'
5
+ autoload :LoginRedirector, 'authmagic/rails/modules/login_redirector'
6
+ autoload :Aliaser, 'authmagic/rails/modules/aliaser'
5
7
  end
@@ -4,38 +4,21 @@ module Authmagic
4
4
  def initialize(context)
5
5
  @context = context
6
6
  context.config.session = :session
7
- context.config.principal = :user
8
-
9
- class << ActiveRecord::Base
10
- def acts_as_principal(options)
11
- options.freeze
12
- metaclass.send(:define_method, :principal_config) { options }
13
- end
14
- end
7
+ context.config.principal = Config.new(:class_name => :user)
15
8
  end
16
9
 
17
10
  def enroll
18
- principal = @context.config.principal
11
+ principal = @context.config.principal.class_name
19
12
  principal = principal.to_s.camelize.constantize unless principal.is_a?(Class)
20
- @context.config.principal_config = principal.respond_to?(:principal_config) ? principal.principal_config : {}
21
13
 
22
14
  @context.extend(ContextMethods)
23
15
  @context.instance_variable_set(:@principal, principal)
24
16
 
25
- session = @context.config.session
26
- @context.config.new_session_path ||= :"new_#{session}_path"
27
- context = @context
17
+ @context.config.session_controller_name ||= "#{@context.config.session.to_s.camelize.pluralize}Controller"
18
+ @context.config.new_session_path ||= :"new_#{@context.config.session}_path"
28
19
  @context.config.application_controller.class_eval do
29
20
  include ApplicationControllerMethods
30
- bn = context.principal.name.underscore
31
- unless bn == 'principal'
32
- cp = "current_#{bn}"
33
- cpid = "#{cp}_id"
34
- private
35
- alias_method cp, :current_principal
36
- alias_method cpid, :current_principal_id
37
- helper_method cp, cpid
38
- end
21
+ helper_method :current_principal_id, :current_principal, :logged_in?, :if_logged_in
39
22
  end
40
23
  end
41
24
 
@@ -44,75 +27,23 @@ module Authmagic
44
27
  end
45
28
 
46
29
  module ApplicationControllerMethods
47
- def self.included(other)
48
- other.class_eval do
49
- helper_method :current_principal_id, :current_principal, :logged_in?, :if_logged_in
50
- end
51
- class << other
52
- private
53
- def require_login(options = {})
54
- before_filter(:require_login!, options)
55
- rescue_from LoginRequired, :with => :redirect_to_new_session
56
- end
57
-
58
- def acts_as_session_controller
59
- include SessionControllerMethods
60
- end
61
- end
62
- end
63
-
64
30
  private
65
31
  def current_principal_id
66
32
  session[:current_principal_id]
67
33
  end
68
34
 
69
- def current_principal
35
+ def current_principal(options = {})
70
36
  id = current_principal_id
71
- id && security_context.principal.find(id) rescue ActiveRecord::RecordNotFound nil
72
- end
73
-
74
- def require_login!
75
- p = current_principal
76
- return p if p
77
- session[:back_url] = request.url
78
- raise LoginRequired
37
+ id && security_context.principal.find(id, options) rescue ActiveRecord::RecordNotFound nil
79
38
  end
80
39
 
81
40
  def logged_in?
82
41
  !!current_principal_id
83
42
  end
84
43
 
85
- def if_logged_in
86
- yield current_principal if logged_in?
87
- end
88
-
89
- def redirect_to_new_session
90
- sp = security_context.config.new_session_path
91
- sp = send(sp) if sp.is_a?(Symbol)
92
- redirect_to(sp)
93
- end
94
-
95
- def redirect_back(default = nil)
96
- u, session[:back_url] = session[:back_url], nil
97
- redirect_to(u || default)
98
- end
99
-
100
44
  def unauthenticate
101
45
  session[:current_principal_id] = nil
102
46
  end
103
47
  end
104
-
105
- module SessionControllerMethods
106
- def authenticate(options = {})
107
- sess = security_context.config.session
108
- cfg = security_context.config.principal_config
109
- login = cfg.fetch(:login_field, :login)
110
- password = cfg.fetch(:password_field, :password)
111
- p = security_context.principal.authenticate(
112
- login => options[login] || params[sess][login],
113
- password => options[password] || params[sess][password])
114
- session[:current_principal_id], session[:current_principal] = p.id, p
115
- end
116
- end
117
48
  end
118
49
  end
@@ -6,130 +6,45 @@ module Authmagic
6
6
 
7
7
  def initialize(context)
8
8
  @context = context
9
-
10
- context.config.resource_action_map = {
11
- :index => :read,
12
- :show => :read,
13
- :new => :create,
14
- :edit => :update,
15
- }
16
9
  end
17
10
 
18
11
  def enroll
19
- ActiveRecord::Base.metaclass.send(:include, ModelRestrict)
20
- @context.principal.send(:include, PrincipalMethods)
21
- @context.config.application_controller.metaclass.send(:include, ApplicationControllerRestrict)
22
- end
23
-
24
- module PrincipalMethods
25
- def may?(action, resource)
26
- resource.permitted?(action, self)
27
- end
28
- end
29
-
30
- module Restrict
31
- def restrict(*args, &block)
32
- opts = args.extract_options!
33
- routine = opts.fetch(:guests, false) ? proc {|p| p && block.call(p) } : block
34
- hash = args.empty? ? {nil => routine} : args.inject({}) {|h, x| h[x.to_sym] = routine; h }
35
- write_inheritable_hash(:security_permissions, hash)
36
- include Permissions
37
- end
38
- end
39
-
40
- module ApplicationControllerRestrict
41
- include Restrict
42
- def restrict_with_application_controller(*args, &block)
43
- restrict_without_application_controller(*args, &block)
44
- include ApplicationControllerMethods
45
- end
46
- alias_method_chain :restrict, :application_controller
12
+ @context.config.application_controller.send(:include, ControllerMethods)
47
13
  end
48
14
 
49
- module ModelRestrict
50
- include Restrict
51
- def restrict_with_model(*args, &block)
52
- restrict_without_model(*args, &block)
53
- include ModelMethods
15
+ module ControllerClassMethods
16
+ private
17
+ def require_principal(opts = {}, &block)
18
+ before_filter opts do |controller|
19
+ controller.instance_eval { deny_action! unless block && block.call(current_principal) }
20
+ end
54
21
  end
55
- alias_method_chain :restrict, :model
56
- end
57
22
 
58
- module Permissions
59
- def self.included(other)
60
- def other.security_permissions
61
- read_inheritable_attribute(:security_permissions)
62
- end
23
+ def require_known_principal(opts = {}, &block)
24
+ require_principal(opts) {|p| p && (!block || block.call(p)) }
63
25
  end
64
26
 
65
- def permitted?(action, principal)
66
- permissions = self.class.security_permissions
67
- !(routine = permissions[action.to_sym] || permissions[nil]) || routine.call(principal)
68
- end
69
- end
27
+ def require_login(opts = {})
28
+ require_known_principal(opts)
29
+ end
30
+ end
70
31
 
71
- module ApplicationControllerMethods
32
+ module ControllerMethods
72
33
  def self.included(other)
73
34
  other.class_eval do
74
- alias_method_chain :permitted?, :defaults
75
- helper_method :permitted?, :permitted_on?, :if_permitted?, :if_permitted_on?
76
- before_filter :check_authorization
77
- rescue_from Unauthorized, :with => :handle_unauthorized
35
+ extend ControllerClassMethods
36
+ rescue_from Unauthorized, :with => :forbid!
78
37
  end
79
38
  end
80
39
 
81
40
  private
82
- def check_authorization
83
- deny! unless permitted?
41
+ def deny_action!
42
+ raise Unauthorized
84
43
  end
85
44
 
86
- def handle_unauthorized
45
+ def forbid!
87
46
  head :forbidden
88
47
  end
89
-
90
- def permitted_with_defaults?(action = action_name, principal = current_principal)
91
- permitted_without_defaults?(action, principal)
92
- end
93
-
94
- def if_permitted(action = action_name, principal = current_principal)
95
- yield if permitted?(action, principal)
96
- end
97
-
98
- def deny!
99
- raise Unauthorized
100
- end
101
-
102
- def deny_if!(condition = nil)
103
- deny! if condition
104
- yield if block_given?
105
- end
106
-
107
- def permit_if!(condition = nil, &block)
108
- deny_if!(!condition, &block)
109
- end
110
-
111
- def guard!(resource, action = action_name, principal = current_principal, &block)
112
- resource.guard!(principal, _map_resource_action(action), &block)
113
- end
114
-
115
- def permitted_on?(resource, action = action_name, principal = current_principal)
116
- resource.may?(principal, _map_resource_action(action))
117
- end
118
-
119
- def if_permitted_on(resource, action = action_name, principal = current_principal)
120
- yield if permitted_on?(resource, action, principal)
121
- end
122
-
123
- def _map_resource_action(action)
124
- security_context.config.resource_action_map.fetch(action, action)
125
- end
126
- end
127
-
128
- module ModelMethods
129
- def guard!(action, principal)
130
- raise Unauthorized unless permitted?(action, principal)
131
- yield if block_given?
132
- end
133
48
  end
134
49
  end
135
50
  end
@@ -11,11 +11,11 @@ module Authmagic
11
11
  def enroll
12
12
  principal = @context.principal
13
13
 
14
- cfg = @context.config.principal_config
14
+ cfg = @context.config.principal
15
15
  login = cfg.fetch(:login_field, :login)
16
16
  case_sensitive = case cfg.fetch(:compare, :case_sensitive)
17
- when :case_sensitive then true
18
- when :case_insensitive then false
17
+ when :cs, :case_sensitive then true
18
+ when :ci, :case_insensitive then false
19
19
  else raise 'bad :compare value'
20
20
  end
21
21
  password = cfg.fetch(:password_field, :password)
@@ -91,6 +91,22 @@ module Authmagic
91
91
  define_method generate_salt do
92
92
  ActiveSupport::SecureRandom.send(secran_salt, salt_length)
93
93
  end
94
+ end
95
+
96
+ @context.config.session_controller_name.constantize.send(:include, SessionControllerMethods)
97
+ end
98
+
99
+ module SessionControllerMethods
100
+ private
101
+ def authenticate_with_login_password(options = {})
102
+ sess = security_context.config.session
103
+ cfg = security_context.config.principal
104
+ login = cfg.fetch(:login_field, :login)
105
+ password = cfg.fetch(:password_field, :password)
106
+ p = security_context.principal.authenticate(
107
+ login => options[login] || params[sess][login],
108
+ password => options[password] || params[sess][password])
109
+ session[:current_principal_id] = p.id
94
110
  end
95
111
  end
96
112
  end
@@ -3,7 +3,7 @@ class SessionsController < ApplicationController
3
3
  end
4
4
 
5
5
  def create
6
- authenticate
6
+ authenticate_with_login_password
7
7
  flash[:notice] = "Login successful!"
8
8
  redirect_back account_url
9
9
  rescue SecurityError => e
@@ -12,7 +12,7 @@ class SessionsController < ApplicationController
12
12
  end
13
13
 
14
14
  def destroy
15
- destroy_session
15
+ unauthenticate
16
16
  flash[:notice] = "Logout successful!"
17
17
  redirect_back new_session_url
18
18
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pipa-authmagic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: "0.1"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Gunko
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-20 00:00:00 -08:00
12
+ date: 2009-01-21 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency