rend-acl 0.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.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +26 -0
- data/README.md +25 -0
- data/Rakefile +9 -0
- data/ZEND_FRAMEWORK_LICENSE.txt +27 -0
- data/lib/rend/acl/exception.rb +6 -0
- data/lib/rend/acl/resource.rb +14 -0
- data/lib/rend/acl/role/registry/exception.rb +10 -0
- data/lib/rend/acl/role/registry.rb +168 -0
- data/lib/rend/acl/role.rb +19 -0
- data/lib/rend/acl/version.rb +7 -0
- data/lib/rend/acl.rb +875 -0
- data/rend-acl.gemspec +34 -0
- data/test/test_acl.rb +209 -0
- metadata +116 -0
data/rend-acl.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rend/acl/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "rend-acl"
|
8
|
+
spec.version = Rend::Acl::Version::STRING
|
9
|
+
spec.authors = ["Daniel Doezema"]
|
10
|
+
spec.email = ["daniel.doezema@gmail.com"]
|
11
|
+
spec.description = "Zend Framework components ported to Ruby -- Core Gem."
|
12
|
+
spec.summary = "rend-acl-#{Rend::Acl::Version::STRING}"
|
13
|
+
spec.homepage = "https://github.com/veloper/rend-acl"
|
14
|
+
spec.license = "New-BSD"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.files += ["LICENSE.txt", "ZEND_FRAMEWORK_LICENSE.txt"]
|
18
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
|
25
|
+
dependency_gems = ['rend-core']
|
26
|
+
|
27
|
+
dependency_gems.each do |gem_name|
|
28
|
+
if Rend::Acl::Version::STRING =~ /[a-zA-Z]+/
|
29
|
+
spec.add_runtime_dependency "#{gem_name}", "= #{Rend::Acl::Version::STRING}"
|
30
|
+
else
|
31
|
+
spec.add_runtime_dependency "#{gem_name}", "~> #{Rend::Acl::Version::STRING.split('.')[0..1].concat(['0']).join('.')}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/test/test_acl.rb
ADDED
@@ -0,0 +1,209 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rend/acl'
|
3
|
+
|
4
|
+
class AclTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
# See: http://framework.zend.com/manual/1.12/en/zend.acl.introduction.html#zend.acl.introduction.roles
|
7
|
+
def test_multiple_inheritance_among_roles
|
8
|
+
@acl = Rend::Acl.new
|
9
|
+
@acl.add_role!('guest').add_role!('member').add_role!('admin')
|
10
|
+
|
11
|
+
parents = %w[guest member admin]
|
12
|
+
@acl.add_role! 'Daniel Doezema', parents
|
13
|
+
|
14
|
+
@acl.add_resource!('gold')
|
15
|
+
|
16
|
+
@acl.deny!('guest', 'gold')
|
17
|
+
@acl.allow!('member', 'gold')
|
18
|
+
|
19
|
+
assert_equal true, @acl.allowed?('Daniel Doezema', 'gold')
|
20
|
+
end
|
21
|
+
|
22
|
+
# http://framework.zend.com/manual/1.12/en/zend.acl.introduction.html#zend.acl.introduction.role_registry
|
23
|
+
def test_registering_roles
|
24
|
+
@acl = Rend::Acl.new
|
25
|
+
guest_role = Rend::Acl::Role.new('guest')
|
26
|
+
@acl.add_role! guest_role
|
27
|
+
@acl.add_role! Rend::Acl::Role.new('staff'), guest_role
|
28
|
+
@acl.add_role! Rend::Acl::Role.new('editor'), 'staff'
|
29
|
+
@acl.add_role! Rend::Acl::Role.new('administrator')
|
30
|
+
|
31
|
+
# Guest may only view content
|
32
|
+
@acl.allow! guest_role, nil, 'view'
|
33
|
+
|
34
|
+
# Staff inherits view privilege from guest, but also needs additional
|
35
|
+
# privileges
|
36
|
+
@acl.allow! 'staff', nil, %w[edit submit revise]
|
37
|
+
|
38
|
+
# Editor inherits view, edit, submit, and revise privileges from
|
39
|
+
# staff, but also needs additional privileges
|
40
|
+
@acl.allow! 'editor', nil, %w[publish archive delete]
|
41
|
+
|
42
|
+
# Administrator inherits nothing, but is allowed all privileges
|
43
|
+
@acl.allow! 'administrator'
|
44
|
+
|
45
|
+
|
46
|
+
assert_equal true, @acl.allowed?('guest', nil, 'view')
|
47
|
+
assert_equal false, @acl.allowed?('staff', nil, 'publish')
|
48
|
+
assert_equal true, @acl.allowed?('staff', nil, 'revise')
|
49
|
+
assert_equal true, @acl.allowed?('editor', nil, 'view') # allowed because of inheritance from guest
|
50
|
+
assert_equal false, @acl.allowed?('editor', nil, 'update') # denied because no allow rule for 'update'
|
51
|
+
assert_equal true, @acl.allowed?('administrator', nil, 'view') # allowed because administrator is allowed all privileges
|
52
|
+
assert_equal true, @acl.allowed?('administrator') # allowed because administrator is allowed all privileges
|
53
|
+
assert_equal true, @acl.allowed?('administrator', nil, 'update') # allowed because administrator is allowed all privileges
|
54
|
+
end
|
55
|
+
|
56
|
+
# http://framework.zend.com/manual/1.12/en/zend.acl.introduction.html#zend.acl.introduction.role_registry
|
57
|
+
def test_precise_access_controls
|
58
|
+
@acl = Rend::Acl.new
|
59
|
+
guest_role = Rend::Acl::Role.new('guest')
|
60
|
+
@acl.add_role! guest_role
|
61
|
+
@acl.add_role! Rend::Acl::Role.new('staff'), guest_role
|
62
|
+
@acl.add_role! Rend::Acl::Role.new('editor'), 'staff'
|
63
|
+
@acl.add_role! Rend::Acl::Role.new('administrator')
|
64
|
+
|
65
|
+
# Guest may only view content
|
66
|
+
@acl.allow! guest_role, nil, 'view'
|
67
|
+
|
68
|
+
# Staff inherits view privilege from guest, but also needs additional
|
69
|
+
# privileges
|
70
|
+
@acl.allow! 'staff', nil, %w[edit submit revise]
|
71
|
+
|
72
|
+
# Editor inherits view, edit, submit, and revise privileges from
|
73
|
+
# staff, but also needs additional privileges
|
74
|
+
@acl.allow! 'editor', nil, %w[publish archive delete]
|
75
|
+
|
76
|
+
# Administrator inherits nothing, but is allowed all privileges
|
77
|
+
@acl.allow! 'administrator'
|
78
|
+
|
79
|
+
# The new marketing group inherits permissions from staff
|
80
|
+
@acl.add_role!(Rend::Acl::Role.new('marketing'), 'staff')
|
81
|
+
|
82
|
+
# === Create Resources for the rules ===
|
83
|
+
|
84
|
+
# newsletter
|
85
|
+
@acl.add_resource!(Rend::Acl::Resource.new('newsletter'))
|
86
|
+
|
87
|
+
# news
|
88
|
+
@acl.add_resource!(Rend::Acl::Resource.new('news'))
|
89
|
+
|
90
|
+
# latest news
|
91
|
+
@acl.add_resource!(Rend::Acl::Resource.new('latest'), 'news')
|
92
|
+
|
93
|
+
# announcement news
|
94
|
+
@acl.add_resource!(Rend::Acl::Resource.new('announcement'), 'news')
|
95
|
+
|
96
|
+
# === Setting up access ====
|
97
|
+
|
98
|
+
# Marketing must be able to publish and archive newsletters and the latest news
|
99
|
+
@acl.allow!('marketing', ['newsletter', 'latest'], ['publish', 'archive'])
|
100
|
+
|
101
|
+
# Staff (and marketing, by inheritance), are denied permission to revise the latest news
|
102
|
+
@acl.deny!('staff', 'latest', 'revise')
|
103
|
+
|
104
|
+
# Everyone (including administrators) are denied permission to archive news announcements
|
105
|
+
@acl.deny!(nil, 'announcement', 'archive')
|
106
|
+
|
107
|
+
|
108
|
+
# === Testing ===
|
109
|
+
|
110
|
+
assert_equal false, @acl.allowed?('staff' , 'newsletter' , 'publish') # denied
|
111
|
+
assert_equal true, @acl.allowed?('marketing' , 'newsletter' , 'publish') # allowed
|
112
|
+
assert_equal false, @acl.allowed?('staff' , 'latest' , 'publish') # denied
|
113
|
+
assert_equal true, @acl.allowed?('marketing' , 'latest' , 'publish') # allowed
|
114
|
+
assert_equal true, @acl.allowed?('marketing' , 'latest' , 'archive') # allowed
|
115
|
+
assert_equal false, @acl.allowed?('marketing' , 'latest' , 'revise') # denied
|
116
|
+
assert_equal false, @acl.allowed?('editor' , 'announcement' , 'archive') # denied
|
117
|
+
assert_equal false, @acl.allowed?('administrator' , 'announcement' , 'archive') # denied
|
118
|
+
|
119
|
+
# === Removing Access Controls ===
|
120
|
+
# To remove one or more access rules from the ACL, simply use the available removeAllow()
|
121
|
+
# or removeDeny() methods. As with allow() and deny(), you may provide a NULL value to indicate
|
122
|
+
# application to all roles, resources, and/or privileges:
|
123
|
+
|
124
|
+
# Remove the denial of revising latest news to staff (and marketing, by inheritance)
|
125
|
+
@acl.remove_deny!('staff', 'latest', 'revise')
|
126
|
+
assert_equal true, @acl.allowed?('marketing', 'latest', 'revise')
|
127
|
+
|
128
|
+
# Remove the allowance of publishing and archiving newsletters to marketing
|
129
|
+
@acl.remove_allow!('marketing', 'newsletter', ['publish', 'archive'])
|
130
|
+
assert_equal false, @acl.allowed?('marketing', 'newsletter', 'publish')
|
131
|
+
assert_equal false, @acl.allowed?('marketing', 'newsletter', 'archive')
|
132
|
+
|
133
|
+
# === Modifying Access Controls ===
|
134
|
+
# Privileges may be modified incrementally as indicated above, but a NIL
|
135
|
+
# value for the privileges overrides such incremental changes:
|
136
|
+
|
137
|
+
# Allow marketing all permissions upon the latest news
|
138
|
+
@acl.allow!('marketing', 'latest')
|
139
|
+
assert_equal true, @acl.allowed?('marketing', 'latest', 'publish') # allowed
|
140
|
+
assert_equal true, @acl.allowed?('marketing', 'latest', 'archive') # allowed
|
141
|
+
assert_equal true, @acl.allowed?('marketing', 'latest', 'anything') # allowed
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_storing_acl_data_for_persistence_with_marshal
|
145
|
+
@acl = Rend::Acl.new
|
146
|
+
guest_role = Rend::Acl::Role.new('guest')
|
147
|
+
@acl.add_role! guest_role
|
148
|
+
@acl.add_role! Rend::Acl::Role.new('staff'), guest_role
|
149
|
+
@acl.add_role! Rend::Acl::Role.new('editor'), 'staff'
|
150
|
+
@acl.add_role! Rend::Acl::Role.new('administrator')
|
151
|
+
|
152
|
+
# Guest may only view content
|
153
|
+
@acl.allow! guest_role, nil, 'view'
|
154
|
+
|
155
|
+
# Staff inherits view privilege from guest, but also needs additional
|
156
|
+
# privileges
|
157
|
+
@acl.allow! 'staff', nil, %w[edit submit revise]
|
158
|
+
|
159
|
+
# Editor inherits view, edit, submit, and revise privileges from
|
160
|
+
# staff, but also needs additional privileges
|
161
|
+
@acl.allow! 'editor', nil, %w[publish archive delete]
|
162
|
+
|
163
|
+
# Administrator inherits nothing, but is allowed all privileges
|
164
|
+
@acl.allow! 'administrator'
|
165
|
+
|
166
|
+
# The new marketing group inherits permissions from staff
|
167
|
+
@acl.add_role!(Rend::Acl::Role.new('marketing'), 'staff')
|
168
|
+
|
169
|
+
# === Create Resources for the rules ===
|
170
|
+
|
171
|
+
# newsletter
|
172
|
+
@acl.add_resource!(Rend::Acl::Resource.new('newsletter'))
|
173
|
+
|
174
|
+
# news
|
175
|
+
@acl.add_resource!(Rend::Acl::Resource.new('news'))
|
176
|
+
|
177
|
+
# latest news
|
178
|
+
@acl.add_resource!(Rend::Acl::Resource.new('latest'), 'news')
|
179
|
+
|
180
|
+
# announcement news
|
181
|
+
@acl.add_resource!(Rend::Acl::Resource.new('announcement'), 'news')
|
182
|
+
|
183
|
+
# === Setting up access ====
|
184
|
+
|
185
|
+
# Marketing must be able to publish and archive newsletters and the latest news
|
186
|
+
@acl.allow!('marketing', ['newsletter', 'latest'], ['publish', 'archive'])
|
187
|
+
|
188
|
+
# Staff (and marketing, by inheritance), are denied permission to revise the latest news
|
189
|
+
@acl.deny!('staff', 'latest', 'revise')
|
190
|
+
|
191
|
+
# Everyone (including administrators) are denied permission to archive news announcements
|
192
|
+
@acl.deny!(nil, 'announcement', 'archive')
|
193
|
+
|
194
|
+
encoded_acl = Marshal.dump(@acl)
|
195
|
+
decoded_acl = Marshal.load(encoded_acl)
|
196
|
+
|
197
|
+
# === Testing ===
|
198
|
+
|
199
|
+
assert_equal false, decoded_acl.allowed?('staff' , 'newsletter' , 'publish') # denied
|
200
|
+
assert_equal true, decoded_acl.allowed?('marketing' , 'newsletter' , 'publish') # allowed
|
201
|
+
assert_equal false, decoded_acl.allowed?('staff' , 'latest' , 'publish') # denied
|
202
|
+
assert_equal true, decoded_acl.allowed?('marketing' , 'latest' , 'publish') # allowed
|
203
|
+
assert_equal true, decoded_acl.allowed?('marketing' , 'latest' , 'archive') # allowed
|
204
|
+
assert_equal false, decoded_acl.allowed?('marketing' , 'latest' , 'revise') # denied
|
205
|
+
assert_equal false, decoded_acl.allowed?('editor' , 'announcement' , 'archive') # denied
|
206
|
+
assert_equal false, decoded_acl.allowed?('administrator' , 'announcement' , 'archive') # denied
|
207
|
+
|
208
|
+
end
|
209
|
+
end
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rend-acl
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Daniel Doezema
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-05-31 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bundler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.3'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rend-core
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.0.0
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.0.0
|
62
|
+
description: Zend Framework components ported to Ruby -- Core Gem.
|
63
|
+
email:
|
64
|
+
- daniel.doezema@gmail.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- .gitignore
|
70
|
+
- Gemfile
|
71
|
+
- LICENSE.txt
|
72
|
+
- README.md
|
73
|
+
- Rakefile
|
74
|
+
- ZEND_FRAMEWORK_LICENSE.txt
|
75
|
+
- lib/rend/acl.rb
|
76
|
+
- lib/rend/acl/exception.rb
|
77
|
+
- lib/rend/acl/resource.rb
|
78
|
+
- lib/rend/acl/role.rb
|
79
|
+
- lib/rend/acl/role/registry.rb
|
80
|
+
- lib/rend/acl/role/registry/exception.rb
|
81
|
+
- lib/rend/acl/version.rb
|
82
|
+
- rend-acl.gemspec
|
83
|
+
- test/test_acl.rb
|
84
|
+
homepage: https://github.com/veloper/rend-acl
|
85
|
+
licenses:
|
86
|
+
- New-BSD
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
hash: 850208410793267425
|
100
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
hash: 850208410793267425
|
109
|
+
requirements: []
|
110
|
+
rubyforge_project:
|
111
|
+
rubygems_version: 1.8.25
|
112
|
+
signing_key:
|
113
|
+
specification_version: 3
|
114
|
+
summary: rend-acl-0.0.1
|
115
|
+
test_files:
|
116
|
+
- test/test_acl.rb
|