tuersteher 0.3.4 → 0.4.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 +1 -1
- data/lib/tuersteher.rb +38 -29
- data/samples/access_rules.rb +9 -9
- data/samples/application_controller.rb +1 -1
- data/spec/acces_rules_storage_spec.rb +11 -7
- data/spec/access_rules_spec.rb +9 -9
- data/spec/model_access_rule_spec.rb +4 -4
- data/spec/model_extensions_spec.rb +1 -1
- data/tuersteher.gemspec +7 -7
- metadata +7 -7
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/tuersteher.rb
CHANGED
@@ -30,6 +30,7 @@ module Tuersteher
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
|
33
34
|
class AccessRulesStorage
|
34
35
|
include Singleton
|
35
36
|
|
@@ -89,9 +90,17 @@ module Tuersteher
|
|
89
90
|
# path: :all fuer beliebig, sonst String mit der http-path beginnen muss,
|
90
91
|
# wird als RegEX-Ausdruck ausgewertet
|
91
92
|
def path url_path
|
92
|
-
|
93
|
-
|
94
|
-
|
93
|
+
if block_given?
|
94
|
+
@current_rule_class = PathAccessRule
|
95
|
+
@current_rule_init = url_path
|
96
|
+
@current_rule_storage = @path_rules
|
97
|
+
yield
|
98
|
+
@current_rule_class = @current_rule_init = nil
|
99
|
+
else
|
100
|
+
rule = PathAccessRule.new(url_path)
|
101
|
+
@path_rules << rule
|
102
|
+
rule
|
103
|
+
end
|
95
104
|
end
|
96
105
|
|
97
106
|
|
@@ -100,9 +109,11 @@ module Tuersteher
|
|
100
109
|
# model_class: Model-Klassenname oder :all fuer alle
|
101
110
|
def model model_class
|
102
111
|
if block_given?
|
103
|
-
@
|
112
|
+
@current_rule_class = ModelAccessRule
|
113
|
+
@current_rule_init = model_class
|
114
|
+
@current_rule_storage = @model_rules
|
104
115
|
yield
|
105
|
-
@
|
116
|
+
@current_rule_class = @current_rule_init = @current_rule_storage = nil
|
106
117
|
else
|
107
118
|
rule = ModelAccessRule.new(model_class)
|
108
119
|
@model_rules << rule
|
@@ -113,16 +124,15 @@ module Tuersteher
|
|
113
124
|
# create new rule as grant-rule
|
114
125
|
# and add this to the model_rules array
|
115
126
|
def grant
|
116
|
-
rule =
|
117
|
-
@
|
127
|
+
rule = @current_rule_class.new(@current_rule_init)
|
128
|
+
@current_rule_storage << rule
|
118
129
|
rule.grant
|
119
130
|
end
|
120
131
|
|
121
132
|
# create new rule as deny-rule
|
122
133
|
# and add this to the model_rules array
|
123
134
|
def deny
|
124
|
-
rule =
|
125
|
-
@model_rules << rule
|
135
|
+
rule = grant
|
126
136
|
rule.deny
|
127
137
|
end
|
128
138
|
|
@@ -332,6 +342,7 @@ module Tuersteher
|
|
332
342
|
|
333
343
|
def initialize
|
334
344
|
@roles = []
|
345
|
+
@access_method = :all
|
335
346
|
end
|
336
347
|
|
337
348
|
# add role
|
@@ -367,6 +378,13 @@ module Tuersteher
|
|
367
378
|
@deny
|
368
379
|
end
|
369
380
|
|
381
|
+
# set methode for access
|
382
|
+
# access_method Name of Methode for access as Symbol
|
383
|
+
def method(access_method)
|
384
|
+
@access_method = access_method
|
385
|
+
self
|
386
|
+
end
|
387
|
+
|
370
388
|
# negate role-membership
|
371
389
|
def not
|
372
390
|
@not = true
|
@@ -385,6 +403,11 @@ module Tuersteher
|
|
385
403
|
false
|
386
404
|
end
|
387
405
|
|
406
|
+
def grant_access_method? method
|
407
|
+
return true if @access_method==:all
|
408
|
+
@access_method == method
|
409
|
+
end
|
410
|
+
|
388
411
|
end # of BaseAccessRule
|
389
412
|
|
390
413
|
|
@@ -392,7 +415,6 @@ module Tuersteher
|
|
392
415
|
|
393
416
|
METHOD_NAMES = [:get, :edit, :put, :delete, :post, :all].freeze
|
394
417
|
|
395
|
-
|
396
418
|
# Zugriffsregel
|
397
419
|
#
|
398
420
|
# path :all fuer beliebig, sonst String mit der http-path beginnen muss
|
@@ -411,14 +433,13 @@ module Tuersteher
|
|
411
433
|
@path = /^#{path}/
|
412
434
|
end
|
413
435
|
end
|
414
|
-
@http_method = :all
|
415
436
|
end
|
416
437
|
|
417
438
|
# set http-methode
|
418
439
|
# http_method http-Method, allowed is :get, :put, :delete, :post, :all
|
419
440
|
def method(http_method)
|
420
441
|
raise "wrong method '#{http_method}'! Must be #{METHOD_NAMES.join(', ')} !" unless METHOD_NAMES.include?(http_method)
|
421
|
-
|
442
|
+
super
|
422
443
|
self
|
423
444
|
end
|
424
445
|
|
@@ -438,10 +459,7 @@ module Tuersteher
|
|
438
459
|
return false
|
439
460
|
end
|
440
461
|
|
441
|
-
|
442
|
-
return false
|
443
|
-
end
|
444
|
-
|
462
|
+
return false unless grant_access_method?(method)
|
445
463
|
return false unless grant_role?(user)
|
446
464
|
return false unless grant_extension?(user)
|
447
465
|
|
@@ -450,7 +468,7 @@ module Tuersteher
|
|
450
468
|
|
451
469
|
|
452
470
|
def to_s
|
453
|
-
s = "PathAccesRule[#{@deny ? 'DENY ' : ''}#{@path}, #{@
|
471
|
+
s = "PathAccesRule[#{@deny ? 'DENY ' : ''}#{@path}, #{@access_method}, #{@roles.join(' ')}"
|
454
472
|
s << " #{@check_extensions.inspect}" if @check_extensions
|
455
473
|
s << ']'
|
456
474
|
s
|
@@ -501,11 +519,6 @@ module Tuersteher
|
|
501
519
|
@clazz = clazz.instance_of?(Symbol) ? clazz : clazz.to_s
|
502
520
|
end
|
503
521
|
|
504
|
-
# set the permission-name
|
505
|
-
def permission permission_name
|
506
|
-
@permission = permission_name
|
507
|
-
self
|
508
|
-
end
|
509
522
|
|
510
523
|
# liefert true, wenn zugriff fuer das angegebene model mit
|
511
524
|
# der Zugriffsart perm für das security_object hat
|
@@ -518,7 +531,7 @@ module Tuersteher
|
|
518
531
|
# *roles ist dabei eine Array aus Symbolen
|
519
532
|
#
|
520
533
|
#
|
521
|
-
def fired? model,
|
534
|
+
def fired? model, access_method, user
|
522
535
|
user = nil if user==:false # manche Authenticate-System setzen den user auf :false
|
523
536
|
m_class = model.instance_of?(Class) ? model : model.class
|
524
537
|
if @clazz!=m_class.to_s && @clazz!=:all
|
@@ -526,18 +539,14 @@ module Tuersteher
|
|
526
539
|
return false
|
527
540
|
end
|
528
541
|
|
529
|
-
|
530
|
-
#Tuersteher::TLogger.logger.debug("#{to_s}.has_access? => false why #{@access_type}!=:all && #{@access_type}!=#{perm}")
|
531
|
-
return false
|
532
|
-
end
|
533
|
-
|
542
|
+
return false unless grant_access_method?(access_method)
|
534
543
|
return false unless grant_role?(user)
|
535
544
|
return false unless grant_extension?(user, model)
|
536
545
|
true
|
537
546
|
end
|
538
547
|
|
539
548
|
def to_s
|
540
|
-
s = "ModelAccessRule[#{@deny ? 'DENY ' : ''}#{@clazz}, #{@
|
549
|
+
s = "ModelAccessRule[#{@deny ? 'DENY ' : ''}#{@clazz}, #{@access_method}, #{@roles.join(' ')}"
|
541
550
|
s << " #{@check_extensions.inspect}" if @check_extensions
|
542
551
|
s << ']'
|
543
552
|
s
|
data/samples/access_rules.rb
CHANGED
@@ -22,22 +22,22 @@ path('/special').grant.extension(:special?, :area1)
|
|
22
22
|
#
|
23
23
|
# Model-Object-Zugriffsregeln
|
24
24
|
# Aufbau:
|
25
|
-
# model(<ModelClass>).grant.
|
25
|
+
# model(<ModelClass>).grant.method(<access-method>)[.role(<role>)][.extension(<method>[, <expected_value>])]
|
26
26
|
# or
|
27
|
-
# model(<ModelClass>).deny.
|
27
|
+
# model(<ModelClass>).deny.method(<access-method>)[.not][.role(<role>)][.extension(<method>[, <expected_value>])]
|
28
28
|
# or
|
29
29
|
# model(<ModelClass> do
|
30
|
-
# grant..
|
31
|
-
# deny.
|
30
|
+
# grant..method(<access-method>)[.role(<role>)][.extension(<method>[, <expected_value>])]
|
31
|
+
# deny.method(<access-method>)[.role(<role>)][.extension(<method>[, <expected_value>])]
|
32
32
|
# ...
|
33
33
|
# end
|
34
34
|
|
35
35
|
|
36
|
-
model(Dashboard).grant.
|
36
|
+
model(Dashboard).grant.method(:view)
|
37
37
|
|
38
38
|
model(Todo) do
|
39
|
-
grant.
|
40
|
-
grant.
|
41
|
-
grant.
|
42
|
-
grant-
|
39
|
+
grant.method(:view)
|
40
|
+
grant.method(:full_view).role(:ADMIN)
|
41
|
+
grant.method(:update).role(:EDITOR).extension(:owned_by?) # calls Todo.owned_by?(current_user)
|
42
|
+
grant-method(:delete).not.role(:ADMIN)
|
43
43
|
end
|
@@ -13,12 +13,16 @@ module Tuersteher
|
|
13
13
|
path('/').grant.method(:get)
|
14
14
|
path(:all).grant.role(:ADMIN)
|
15
15
|
path('/special').grant.extension(:special?, :area1)
|
16
|
+
path('/pictures') do
|
17
|
+
grant.role(:admin)
|
18
|
+
deny.role(:guest)
|
19
|
+
end
|
16
20
|
|
17
|
-
model(Dashboard).grant.
|
21
|
+
model(Dashboard).grant.method(:view)
|
18
22
|
model(Todo) do
|
19
|
-
grant.
|
20
|
-
grant.
|
21
|
-
grant.
|
23
|
+
grant.method(:view)
|
24
|
+
grant.method(:full_view).role(:ADMIN)
|
25
|
+
grant.method(:update).role(:EDITOR).extension(:owned_by?) # calls Todo.owned_by?(current_user)
|
22
26
|
end
|
23
27
|
EOR
|
24
28
|
AccessRulesStorage.instance.eval_rules rule_defs
|
@@ -26,11 +30,11 @@ end
|
|
26
30
|
@model_rules = AccessRulesStorage.instance.model_rules
|
27
31
|
end
|
28
32
|
|
29
|
-
|
30
|
-
@path_rules.should have(
|
33
|
+
specify do
|
34
|
+
@path_rules.should have(5).items
|
31
35
|
end
|
32
36
|
|
33
|
-
|
37
|
+
specify do
|
34
38
|
@model_rules.should have(4).items
|
35
39
|
end
|
36
40
|
|
data/spec/access_rules_spec.rb
CHANGED
@@ -92,11 +92,11 @@ module Tuersteher
|
|
92
92
|
|
93
93
|
before do
|
94
94
|
rules = [
|
95
|
-
ModelAccessRule.new(SampleModel1).grant.
|
96
|
-
ModelAccessRule.new(SampleModel2).grant.
|
97
|
-
ModelAccessRule.new(SampleModel2).grant.
|
98
|
-
ModelAccessRule.new(SampleModel2).deny.
|
99
|
-
ModelAccessRule.new(SampleModel2).grant.
|
95
|
+
ModelAccessRule.new(SampleModel1).grant.method(:all),
|
96
|
+
ModelAccessRule.new(SampleModel2).grant.method(:read),
|
97
|
+
ModelAccessRule.new(SampleModel2).grant.method(:update).role(:user).extension(:owner?),
|
98
|
+
ModelAccessRule.new(SampleModel2).deny.method(:create),
|
99
|
+
ModelAccessRule.new(SampleModel2).grant.method(:all).role(:admin),
|
100
100
|
]
|
101
101
|
AccessRulesStorage.instance.stub(:model_rules).and_return(rules)
|
102
102
|
@user = stub('user')
|
@@ -143,12 +143,12 @@ module Tuersteher
|
|
143
143
|
end
|
144
144
|
|
145
145
|
context "without user" do
|
146
|
-
it "should be true for this
|
146
|
+
it "should be true for this models" do
|
147
147
|
AccessRules.model_access?(nil, @model1, :xyz).should be_true
|
148
148
|
AccessRules.model_access?(nil, @model2, :read).should be_true
|
149
149
|
end
|
150
150
|
|
151
|
-
it "should not be true for this
|
151
|
+
it "should not be true for this models" do
|
152
152
|
AccessRules.model_access?(nil, @model2, :update).should_not be_true
|
153
153
|
end
|
154
154
|
end
|
@@ -164,8 +164,8 @@ module Tuersteher
|
|
164
164
|
|
165
165
|
before do
|
166
166
|
rules = [
|
167
|
-
ModelAccessRule.new(SampleModel).
|
168
|
-
ModelAccessRule.new(SampleModel).
|
167
|
+
ModelAccessRule.new(SampleModel).method(:update).role(:admin),
|
168
|
+
ModelAccessRule.new(SampleModel).method(:update).role(:user).extension(:owner?),
|
169
169
|
]
|
170
170
|
AccessRulesStorage.instance.stub(:model_rules).and_return(rules)
|
171
171
|
@user = stub('user')
|
@@ -6,7 +6,7 @@ module Tuersteher
|
|
6
6
|
|
7
7
|
context "grant without user" do
|
8
8
|
before do
|
9
|
-
@rule = ModelAccessRule.new(String).grant.
|
9
|
+
@rule = ModelAccessRule.new(String).grant.method(:all)
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should fired without user" do
|
@@ -23,7 +23,7 @@ module Tuersteher
|
|
23
23
|
context "grant with roles" do
|
24
24
|
|
25
25
|
before(:all) do
|
26
|
-
@rule = ModelAccessRule.new(String).grant.
|
26
|
+
@rule = ModelAccessRule.new(String).grant.method(:read).role(:sysadmin).role(:admin)
|
27
27
|
end
|
28
28
|
|
29
29
|
context "for User with role :admin" do
|
@@ -40,7 +40,7 @@ module Tuersteher
|
|
40
40
|
@rule.fired?(12345, :read, @user).should_not be_true
|
41
41
|
end
|
42
42
|
|
43
|
-
it "should not be fired for String-Object and other access-
|
43
|
+
it "should not be fired for String-Object and other access-method as :read" do
|
44
44
|
@rule.fired?("test", :delete, @user).should_not be_true
|
45
45
|
end
|
46
46
|
end
|
@@ -60,7 +60,7 @@ module Tuersteher
|
|
60
60
|
|
61
61
|
context "deny with not.role" do
|
62
62
|
before(:all) do
|
63
|
-
@rule = ModelAccessRule.new(String).deny.
|
63
|
+
@rule = ModelAccessRule.new(String).deny.method(:append).not.role(:admin)
|
64
64
|
@user = stub('user')
|
65
65
|
end
|
66
66
|
|
@@ -14,7 +14,7 @@ module Tuersteher
|
|
14
14
|
|
15
15
|
|
16
16
|
before do
|
17
|
-
rules = [ModelAccessRule.new(SampleModel).grant.
|
17
|
+
rules = [ModelAccessRule.new(SampleModel).grant.method(:deactived).role(:admin)]
|
18
18
|
AccessRulesStorage.instance.stub(:model_rules).and_return(rules)
|
19
19
|
@user = stub('user')
|
20
20
|
Thread.current[:user] = @user
|
data/tuersteher.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{tuersteher}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.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-09-
|
12
|
+
s.date = %q{2010-09-04}
|
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 = [
|
@@ -41,12 +41,12 @@ Gem::Specification.new do |s|
|
|
41
41
|
s.rubygems_version = %q{1.3.7}
|
42
42
|
s.summary = %q{Security-Layer for Rails-Application}
|
43
43
|
s.test_files = [
|
44
|
-
"spec/
|
45
|
-
"spec/model_access_rule_spec.rb",
|
44
|
+
"spec/spec_helper.rb",
|
46
45
|
"spec/model_extensions_spec.rb",
|
47
|
-
"spec/
|
48
|
-
"spec/
|
49
|
-
"spec/
|
46
|
+
"spec/access_rules_spec.rb",
|
47
|
+
"spec/path_access_rule_spec.rb",
|
48
|
+
"spec/model_access_rule_spec.rb",
|
49
|
+
"spec/acces_rules_storage_spec.rb"
|
50
50
|
]
|
51
51
|
|
52
52
|
if s.respond_to? :specification_version then
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tuersteher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 3
|
9
8
|
- 4
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.4.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-09-
|
18
|
+
date: 2010-09-04 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -81,9 +81,9 @@ signing_key:
|
|
81
81
|
specification_version: 3
|
82
82
|
summary: Security-Layer for Rails-Application
|
83
83
|
test_files:
|
84
|
+
- spec/spec_helper.rb
|
85
|
+
- spec/model_extensions_spec.rb
|
86
|
+
- spec/access_rules_spec.rb
|
84
87
|
- spec/path_access_rule_spec.rb
|
85
88
|
- spec/model_access_rule_spec.rb
|
86
|
-
- spec/model_extensions_spec.rb
|
87
89
|
- spec/acces_rules_storage_spec.rb
|
88
|
-
- spec/spec_helper.rb
|
89
|
-
- spec/access_rules_spec.rb
|