tuersteher 0.2.2 → 0.3.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.3.0
@@ -94,16 +94,6 @@ module Tuersteher
94
94
  # definiert Model-basierende Zugriffsregel
95
95
  #
96
96
  # model_class: Model-Klassenname oder :all fuer alle
97
- # access_type: Zugriffsart (:create, :update, :destroy, :all o.A. selbst definierte Typen)
98
- # roles Aufzählung der erforderliche Rolen (:all für ist egal),
99
- # hier ist auch ein Array von Symbolen möglich
100
- # block optionaler Block, wird mit model und user aufgerufen und muss true oder false liefern
101
- # hier ein Beispiel mit Block:
102
- # <code>
103
- # # Regel, in der sich jeder User selbst aendern darf
104
- # grant_model(User, :update, :all){|model,user| model.id==user.id}
105
- # </code>
106
- #
107
97
  def model model_class
108
98
  if block_given?
109
99
  @current_model_class = model_class
@@ -152,7 +142,7 @@ module Tuersteher
152
142
  end
153
143
  Tuersteher::TLogger.logger.debug("Tuersteher: path_access?(#{path}, #{method}) => #{s}")
154
144
  end
155
- rule!=nil && !rule.deny?
145
+ !(rule.nil? || rule.deny?)
156
146
  end
157
147
 
158
148
 
@@ -270,6 +260,7 @@ module Tuersteher
270
260
 
271
261
  end
272
262
 
263
+
273
264
  # Astracte base class for Access-Rules
274
265
  class BaseAccessRule
275
266
 
@@ -304,14 +295,19 @@ module Tuersteher
304
295
  @deny
305
296
  end
306
297
 
298
+ def not
299
+ @not = true
300
+ self
301
+ end
302
+
307
303
  protected
308
304
 
309
305
  def grant_role? user
310
306
  return true if @roles.empty?
311
307
  return false if user.nil?
312
- @roles.each do |role|
313
- return true if user.has_role?(role)
314
- end
308
+ role = @roles.detect{|r| user.has_role?(r)}
309
+ role = !role if @not
310
+ return true if role
315
311
  false
316
312
  end
317
313
 
@@ -358,7 +354,7 @@ module Tuersteher
358
354
  # path / method fuer den current_user erlaubt ist
359
355
  #
360
356
  # user ist ein Object (meist der Loginuser),
361
- # welcher die Methode 'has_role?(*roles)' besitzen muss.
357
+ # welcher die Methode 'has_role?(role)' besitzen muss.
362
358
  # *roles ist dabei eine Array aus Symbolen
363
359
  #
364
360
  def fired?(path, method, user)
@@ -372,11 +368,7 @@ module Tuersteher
372
368
  return false
373
369
  end
374
370
 
375
- if !@roles.empty? && (user.nil? || !user.has_role?(*@roles))
376
- #Tuersteher::TLogger.logger.debug("#{to_s}.has_access? => false why #{@roles.first}!=:all && #{!user.has_role?(*@roles)}")
377
- return false
378
- end
379
-
371
+ return false unless grant_role?(user)
380
372
  return false unless grant_extension?(user)
381
373
 
382
374
  true
@@ -8,10 +8,11 @@
8
8
  #
9
9
  # Pfad-Zugriffsregeln
10
10
  # Aufbau:
11
- # Path : URL-Pfad, wird als regex ausgewertet
12
- # Methode : :all, :get, :put, :post, :delete oder :edit
13
- # roles :Liste der berechtigten Rollen (es können mehrere Rollen durch Komma getrennt angegeben werden)
14
- #
11
+ # path(<path>).grant[.method(<methode>)][.not][.role(<role>)][.extension(<ext_method>[, <expected_value>)]
12
+ # or
13
+ # path(<path>).deny[.method(<methode>)][.not][.role(<role>)][.extension(<ext_method>[, <expected_value>)]
14
+ # with
15
+ # <method>: HTTP-Method name as Symbol (:get, :put, :post, :delete) or :all
15
16
 
16
17
  path('/').grant.method(:get)
17
18
  path(:all).grant.role(:ADMIN)
@@ -21,14 +22,16 @@ path('/special').grant.extension(:special?, :area1)
21
22
  #
22
23
  # Model-Object-Zugriffsregeln
23
24
  # Aufbau:
24
- # Model-Klasse : Klasse des Models
25
- # Zugriffsart : frei definierbares Symbol, empfohlen :update, :create, :destroy
26
- # Roles : Aufzählung der Rollen
27
- # Block : optionaler Block, diesem wird die Model-Instance und der User als Parameter bereitgestellt
25
+ # model(<ModelClass>).grant.permission(<permission>)[.role(<role>)][.extension(<method>[, <expected_value>])]
26
+ # or
27
+ # model(<ModelClass>).deny.permission(<permission>)[.not][.role(<role>)][.extension(<method>[, <expected_value>])]
28
+ # or
29
+ # model(<ModelClass> do
30
+ # grant..permission(<permission>)[.role(<role>)][.extension(<method>[, <expected_value>])]
31
+ # deny.permission(<permission>)[.role(<role>)][.extension(<method>[, <expected_value>])]
32
+ # ...
33
+ # end
28
34
 
29
- #grant_model String, :view, :all
30
- #grant_model String, :view, :ADMIN, :EDITOR
31
- #grant_model String, :update, :EDITOR do |model, user| model == user.name end
32
35
 
33
36
  model(Dashboard).grant.permission(:view)
34
37
 
@@ -36,4 +39,5 @@ model(Todo) do
36
39
  grant.permission(:view)
37
40
  grant.permission(:full_view).role(:ADMIN)
38
41
  grant.permission(:update).role(:EDITOR).extension(:owned_by?) # calls Todo.owned_by?(current_user)
42
+ grant-permission(:delete).not.role(:ADMIN)
39
43
  end
@@ -1,7 +1,5 @@
1
1
  require "spec_helper"
2
2
 
3
-
4
-
5
3
  module Tuersteher
6
4
 
7
5
  describe AccessRules do
@@ -4,39 +4,61 @@ module Tuersteher
4
4
 
5
5
  describe ModelAccessRule do
6
6
 
7
- before(:all) do
8
- @rule = ModelAccessRule.new(String).grant.permission(:read).role(:sysadmin).role(:admin)
9
- end
7
+ context "grant with roles" do
10
8
 
11
- context "for User with role :admin" do
12
- before do
13
- @user = stub('user')
14
- @user.stub(:has_role?){|role| role==:admin}
9
+ before(:all) do
10
+ @rule = ModelAccessRule.new(String).grant.permission(:read).role(:sysadmin).role(:admin)
15
11
  end
16
12
 
17
- it "should be fired for String-Object and access-type :read" do
18
- @rule.fired?("test", :read, @user).should be_true
19
- end
13
+ context "for User with role :admin" do
14
+ before do
15
+ @user = stub('user')
16
+ @user.stub(:has_role?) { |role| role==:admin }
17
+ end
20
18
 
21
- it "should not be fired for Non-String-Object" do
22
- @rule.fired?(12345, :read, @user).should_not be_true
19
+ it "should be fired for String-Object and access-type :read" do
20
+ @rule.fired?("test", :read, @user).should be_true
21
+ end
22
+
23
+ it "should not be fired for Non-String-Object" do
24
+ @rule.fired?(12345, :read, @user).should_not be_true
25
+ end
26
+
27
+ it "should not be fired for String-Object and other access-type as :read" do
28
+ @rule.fired?("test", :delete, @user).should_not be_true
29
+ end
23
30
  end
24
31
 
25
- it "should not be fired for String-Object and other access-type as :read" do
26
- @rule.fired?("test", :delete, @user).should_not be_true
32
+ context "for User without role :admin" do
33
+ before do
34
+ @user = stub('user')
35
+ @user.stub(:has_role?).and_return(false)
36
+ end
37
+
38
+ it "should not be fired for String-Object and access-type :read" do
39
+ @rule.fired?("test", :read, @user).should_not be_true
40
+ end
27
41
  end
28
- end
42
+ end # of context "grant with roles"
29
43
 
30
- context "for User without role :admin" do
31
- before do
44
+
45
+ context "deny with not.role" do
46
+ before(:all) do
47
+ @rule = ModelAccessRule.new(String).deny.permission(:append).not.role(:admin)
32
48
  @user = stub('user')
33
- @user.stub(:has_role?).and_return(false)
34
49
  end
35
50
 
36
- it "should not be fired for String-Object and access-type :read" do
37
- @rule.fired?("test", :read, @user).should_not be_true
51
+ it "should not fired for user with role :admin" do
52
+ @user.stub(:has_role?){|role| role==:admin}
53
+ @rule.fired?("/admin", :append, @user).should_not be_true
38
54
  end
39
- end
55
+
56
+ it "should fired for user with role :user" do
57
+ @user.stub(:has_role?){|role| role==:user}
58
+ @rule.fired?("/admin", :append, @user).should be_true
59
+ end
60
+ end # of context "deny with not.role"
61
+
40
62
  end
41
63
 
42
64
  end
@@ -4,126 +4,164 @@ module Tuersteher
4
4
 
5
5
  describe PathAccessRule do
6
6
 
7
- before(:all) do
8
- @rule = PathAccessRule.new('/admin').method(:get).role(:sysadmin).role(:admin)
9
- end
7
+ context "grant" do
8
+ before(:all) do
9
+ @rule = PathAccessRule.new('/admin').grant.method(:get).role(:sysadmin).role(:admin)
10
+ end
10
11
 
11
12
 
12
- context "for User with role :admin" do
13
- before do
14
- @user = stub('user')
15
- @user.stub(:has_role?).with(:sysadmin, :admin).and_return(true)
16
- end
13
+ context "for User with role :admin" do
14
+ before do
15
+ @user = stub('user')
16
+ @user.stub(:has_role?){|role| role==:admin}
17
+ end
17
18
 
18
- it "should be fired for path='/admin/xyz' and method :get" do
19
- @rule.fired?("/admin/xyz", :get, @user).should be_true
20
- end
19
+ it "should be fired for path='/admin/xyz' and method :get" do
20
+ @rule.fired?("/admin/xyz", :get, @user).should be_true
21
+ end
21
22
 
22
- it "should not be fired for other path" do
23
- @rule.fired?('/todos/admin', :get, @user).should_not be_true
24
- end
23
+ it "should not be fired for other path" do
24
+ @rule.fired?('/todos/admin', :get, @user).should_not be_true
25
+ end
25
26
 
26
- it "should not be fired for other method as :get" do
27
- @rule.fired?("/admin/xyz", :post, @user).should_not be_true
27
+ it "should not be fired for other method as :get" do
28
+ @rule.fired?("/admin/xyz", :post, @user).should_not be_true
29
+ end
28
30
  end
29
- end
30
31
 
31
32
 
32
- context "for User without role :admin" do
33
- before do
34
- @user = stub('user')
35
- @user.stub(:has_role?).and_return(false)
36
- end
33
+ context "for User without role :admin" do
34
+ before do
35
+ @user = stub('user')
36
+ @user.stub(:has_role?).and_return(false)
37
+ end
37
38
 
38
- it "should not be fired for correct path and method" do
39
- @rule.fired?("/admin/xyz", :get, @user).should_not be_true
39
+ it "should not be fired for correct path and method" do
40
+ @rule.fired?("/admin/xyz", :get, @user).should_not be_true
41
+ end
40
42
  end
41
- end
42
43
 
43
44
 
44
- context "Rule with :all as Path-Matcher" do
45
- before(:all) do
46
- @rule = PathAccessRule.new(:all).method(:get).role(:sysadmin).role(:admin)
47
- @user = stub('user')
48
- @user.stub(:has_role?).and_return(true)
49
- end
45
+ context "Rule with :all as Path-Matcher" do
46
+ before(:all) do
47
+ @rule = PathAccessRule.new(:all).method(:get).role(:sysadmin).role(:admin)
48
+ @user = stub('user')
49
+ @user.stub(:has_role?).and_return(true)
50
+ end
50
51
 
51
- it "should fired for several paths" do
52
- @rule.fired?("/admin/xyz", :get, @user).should be_true
53
- @rule.fired?("/xyz", :get, @user).should be_true
54
- @rule.fired?("/", :get, @user).should be_true
55
- end
52
+ it "should fired for several paths" do
53
+ @rule.fired?("/admin/xyz", :get, @user).should be_true
54
+ @rule.fired?("/xyz", :get, @user).should be_true
55
+ @rule.fired?("/", :get, @user).should be_true
56
+ end
56
57
 
57
- it "should not be fired with other method" do
58
- @rule.fired?("/admin/xyz", :post, @user).should_not be_true
58
+ it "should not be fired with other method" do
59
+ @rule.fired?("/admin/xyz", :post, @user).should_not be_true
60
+ end
59
61
  end
60
- end
61
62
 
62
63
 
63
- context "Rule with no Methode spezifed => all methods allowed" do
64
- before(:all) do
65
- @rule = PathAccessRule.new('/admin').role(:sysadmin).role(:admin)
66
- @user = stub('user')
67
- @user.stub(:has_role?).and_return(true)
64
+ context "Rule with no Methode spezifed => all methods allowed" do
65
+ before(:all) do
66
+ @rule = PathAccessRule.new('/admin').role(:sysadmin).role(:admin)
67
+ @user = stub('user')
68
+ @user.stub(:has_role?).and_return(true)
69
+ end
70
+
71
+ it "should fired for several methods" do
72
+ @rule.fired?("/admin/xyz", :get, @user).should be_true
73
+ @rule.fired?("/admin/xyz", :post, @user).should be_true
74
+ @rule.fired?("/admin/xyz", :put, @user).should be_true
75
+ @rule.fired?("/admin/xyz", :delete, @user).should be_true
76
+ end
77
+
78
+ it "should not be fired with other path" do
79
+ @rule.fired?("/xyz", :post, @user).should_not be_true
80
+ end
68
81
  end
69
82
 
70
- it "should fired for several methods" do
71
- @rule.fired?("/admin/xyz", :get, @user).should be_true
72
- @rule.fired?("/admin/xyz", :post, @user).should be_true
73
- @rule.fired?("/admin/xyz", :put, @user).should be_true
74
- @rule.fired?("/admin/xyz", :delete, @user).should be_true
83
+
84
+ context "Rule with no role spezifed => now role needed" do
85
+ before(:all) do
86
+ @rule = PathAccessRule.new('/admin').method(:get)
87
+ @user = stub('user')
88
+ @user.stub(:has_role?).and_return(false)
89
+ end
90
+
91
+ it "should fired for user with no roles" do
92
+ @rule.fired?("/admin/xyz", :get, @user).should be_true
93
+ end
94
+
95
+ it "should not be fired with other path" do
96
+ @rule.fired?("/xyz", :get, @user).should_not be_true
97
+ end
75
98
  end
76
99
 
77
- it "should not be fired with other path" do
78
- @rule.fired?("/xyz", :post, @user).should_not be_true
100
+
101
+ context "Rule with extension" do
102
+ before(:all) do
103
+ @rule = PathAccessRule.new('/admin').method(:get).extension(:modul_function?, :testvalue)
104
+ @rule2 = PathAccessRule.new('/admin').method(:get).extension(:modul_function2?)
105
+ @user = stub('user')
106
+ @user.stub(:has_role?).and_return(false)
107
+ end
108
+
109
+ it "should not be fired with user have not the check_extension" do
110
+ @rule.fired?("/admin", :get, @user).should_not be_true
111
+ end
112
+
113
+ it "should fired for user with true for check-extension" do
114
+ @user.should_receive(:modul_function?).with(:testvalue).and_return(true)
115
+ @rule.fired?("/admin/xyz", :get, @user).should be_true
116
+ end
117
+
118
+ it "should not be fired for user with false for check-extension" do
119
+ @user.should_receive(:modul_function?).with(:testvalue).and_return(false)
120
+ @rule.fired?("/admin/xyz", :get, @user).should_not be_true
121
+ end
122
+
123
+ it "should fired for rule2 and user with true for check-extension" do
124
+ @user.should_receive(:modul_function2?).and_return(true)
125
+ @rule2.fired?("/admin/xyz", :get, @user).should be_true
126
+ end
79
127
  end
80
- end
128
+ end # of context "grant" do
81
129
 
82
130
 
83
- context "Rule with no role spezifed => now role needed" do
131
+ context "deny" do
84
132
  before(:all) do
85
- @rule = PathAccessRule.new('/admin').method(:get)
133
+ @rule = PathAccessRule.new('/admin').deny.role(:user)
86
134
  @user = stub('user')
87
- @user.stub(:has_role?).and_return(false)
88
135
  end
89
136
 
90
- it "should fired for user with no roles" do
91
- @rule.fired?("/admin/xyz", :get, @user).should be_true
137
+ it "should fired for user with role :user" do
138
+ @user.stub(:has_role?){|role| role==:user}
139
+ @rule.fired?("/admin", :get, @user).should be_true
92
140
  end
93
141
 
94
- it "should not be fired with other path" do
95
- @rule.fired?("/xyz", :get, @user).should_not be_true
142
+ it "should not fired for user with role :admin" do
143
+ @user.stub(:has_role?){|role| role==:admin}
144
+ @rule.fired?("/admin", :get, @user).should_not be_true
96
145
  end
97
- end
146
+ end # of context "deny" do
98
147
 
99
148
 
100
- context "Rule with extension" do
149
+ context "with not as role prefix" do
101
150
  before(:all) do
102
- @rule = PathAccessRule.new('/admin').method(:get).extension(:modul_function?, :testvalue)
103
- @rule2 = PathAccessRule.new('/admin').method(:get).extension(:modul_function2?)
151
+ @rule = PathAccessRule.new('/admin').deny.not.role(:admin)
104
152
  @user = stub('user')
105
- @user.stub(:has_role?).and_return(false)
106
153
  end
107
154
 
108
- it "should not be fired with user have not the check_extension" do
155
+ it "should not fired for user with role :admin" do
156
+ @user.stub(:has_role?){|role| role==:admin}
109
157
  @rule.fired?("/admin", :get, @user).should_not be_true
110
158
  end
111
159
 
112
- it "should fired for user with true for check-extension" do
113
- @user.should_receive(:modul_function?).with(:testvalue).and_return(true)
114
- @rule.fired?("/admin/xyz", :get, @user).should be_true
115
- end
116
-
117
- it "should not be fired for user with false for check-extension" do
118
- @user.should_receive(:modul_function?).with(:testvalue).and_return(false)
119
- @rule.fired?("/admin/xyz", :get, @user).should_not be_true
160
+ it "should fired for user with role :user" do
161
+ @user.stub(:has_role?){|role| role==:user}
162
+ @rule.fired?("/admin", :get, @user).should be_true
120
163
  end
121
-
122
- it "should fired for rule2 and user with true for check-extension" do
123
- @user.should_receive(:modul_function2?).and_return(true)
124
- @rule2.fired?("/admin/xyz", :get, @user).should be_true
125
- end
126
- end
127
-
164
+ end # of context "not" do
165
+
128
166
  end
129
167
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{tuersteher}
8
- s.version = "0.2.2"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Bernd Ledig"]
12
- s.date = %q{2010-08-29}
12
+ s.date = %q{2010-08-30}
13
13
  s.description = %q{Security-Layer for Rails-Application acts like a firewall.}
14
14
  s.email = %q{bernd@ledig.info}
15
15
  s.extra_rdoc_files = [
@@ -40,11 +40,11 @@ Gem::Specification.new do |s|
40
40
  s.rubygems_version = %q{1.3.7}
41
41
  s.summary = %q{Security-Layer for Rails-Application}
42
42
  s.test_files = [
43
- "spec/spec_helper.rb",
44
- "spec/access_rules_spec.rb",
43
+ "spec/acces_rules_storage_spec.rb",
45
44
  "spec/path_access_rule_spec.rb",
46
45
  "spec/model_access_rule_spec.rb",
47
- "spec/acces_rules_storage_spec.rb"
46
+ "spec/access_rules_spec.rb",
47
+ "spec/spec_helper.rb"
48
48
  ]
49
49
 
50
50
  if s.respond_to? :specification_version then
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 2
9
- - 2
10
- version: 0.2.2
8
+ - 3
9
+ - 0
10
+ version: 0.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Bernd Ledig
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-29 00:00:00 +02:00
18
+ date: 2010-08-30 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -80,8 +80,8 @@ signing_key:
80
80
  specification_version: 3
81
81
  summary: Security-Layer for Rails-Application
82
82
  test_files:
83
- - spec/spec_helper.rb
84
- - spec/access_rules_spec.rb
83
+ - spec/acces_rules_storage_spec.rb
85
84
  - spec/path_access_rule_spec.rb
86
85
  - spec/model_access_rule_spec.rb
87
- - spec/acces_rules_storage_spec.rb
86
+ - spec/access_rules_spec.rb
87
+ - spec/spec_helper.rb