annotation_security 1.0.2 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/CHANGELOG +22 -0
  2. data/HOW-TO +261 -0
  3. data/{LICENSE → MIT-LICENSE} +1 -1
  4. data/README +39 -0
  5. data/Rakefile +53 -62
  6. data/assets/app/helpers/annotation_security_helper.rb +8 -8
  7. data/assets/config/initializers/annotation_security.rb +11 -11
  8. data/assets/config/security/relations.rb +20 -20
  9. data/assets/vendor/plugins/annotation_security/init.rb +14 -14
  10. data/bin/annotation_security +7 -7
  11. data/lib/annotation_security.rb +94 -103
  12. data/lib/annotation_security/exceptions.rb +124 -124
  13. data/lib/annotation_security/exec.rb +188 -188
  14. data/lib/annotation_security/includes/helper.rb +215 -215
  15. data/lib/annotation_security/includes/resource.rb +84 -84
  16. data/lib/annotation_security/includes/role.rb +30 -30
  17. data/lib/annotation_security/includes/user.rb +26 -26
  18. data/lib/annotation_security/manager/policy_factory.rb +29 -29
  19. data/lib/annotation_security/manager/policy_manager.rb +87 -79
  20. data/lib/annotation_security/manager/relation_loader.rb +272 -272
  21. data/lib/annotation_security/manager/resource_manager.rb +36 -36
  22. data/lib/annotation_security/manager/right_loader.rb +87 -87
  23. data/lib/annotation_security/policy/abstract_policy.rb +344 -344
  24. data/lib/annotation_security/policy/abstract_static_policy.rb +75 -75
  25. data/lib/annotation_security/policy/all_resources_policy.rb +20 -20
  26. data/lib/annotation_security/policy/rule.rb +340 -340
  27. data/lib/annotation_security/policy/rule_set.rb +138 -138
  28. data/lib/annotation_security/rails.rb +22 -39
  29. data/lib/{extensions → annotation_security/rails/2/extensions}/filter.rb +131 -133
  30. data/lib/annotation_security/rails/2/includes/action_controller.rb +144 -0
  31. data/lib/annotation_security/rails/2/includes/active_record.rb +28 -0
  32. data/lib/annotation_security/rails/2/initializer.rb +35 -0
  33. data/lib/annotation_security/{model_observer.rb → rails/2/model_observer.rb} +61 -61
  34. data/lib/annotation_security/rails/3/extensions/filter.rb +28 -0
  35. data/lib/annotation_security/{includes → rails/3/includes}/action_controller.rb +143 -144
  36. data/lib/annotation_security/{includes → rails/3/includes}/active_record.rb +27 -27
  37. data/lib/annotation_security/rails/3/initializer.rb +40 -0
  38. data/lib/annotation_security/rails/3/model_observer.rb +61 -0
  39. data/lib/annotation_security/rails/extensions.rb +21 -0
  40. data/lib/{extensions → annotation_security/rails/extensions}/action_controller.rb +31 -32
  41. data/lib/{extensions → annotation_security/rails/extensions}/active_record.rb +33 -34
  42. data/lib/{extensions → annotation_security/rails/extensions}/object.rb +10 -10
  43. data/lib/annotation_security/{filters.rb → rails/filters.rb} +37 -37
  44. data/lib/annotation_security/user_wrapper.rb +73 -73
  45. data/lib/annotation_security/utils.rb +141 -141
  46. data/lib/security_context.rb +588 -589
  47. data/spec/annotation_security/exceptions_spec.rb +16 -16
  48. data/spec/annotation_security/includes/helper_spec.rb +82 -82
  49. data/spec/annotation_security/manager/policy_manager_spec.rb +15 -15
  50. data/spec/annotation_security/manager/resource_manager_spec.rb +17 -17
  51. data/spec/annotation_security/manager/right_loader_spec.rb +17 -17
  52. data/spec/annotation_security/policy/abstract_policy_spec.rb +16 -16
  53. data/spec/annotation_security/policy/all_resources_policy_spec.rb +24 -24
  54. data/spec/annotation_security/policy/rule_set_spec.rb +112 -112
  55. data/spec/annotation_security/policy/rule_spec.rb +77 -77
  56. data/spec/annotation_security/policy/test_policy_spec.rb +80 -80
  57. data/spec/annotation_security/security_context_spec.rb +129 -78
  58. data/spec/annotation_security/utils_spec.rb +73 -73
  59. data/spec/helper/test_controller.rb +65 -65
  60. data/spec/helper/test_helper.rb +5 -5
  61. data/spec/helper/test_relations.rb +6 -6
  62. data/spec/helper/test_resource.rb +38 -38
  63. data/spec/helper/test_role.rb +21 -21
  64. data/spec/helper/test_user.rb +31 -31
  65. data/spec/rails_stub.rb +44 -37
  66. metadata +110 -96
  67. data/CHANGELOG.md +0 -14
  68. data/HOW-TO.md +0 -275
  69. data/README.md +0 -39
  70. data/lib/annotation_security/version.rb +0 -10
data/spec/rails_stub.rb CHANGED
@@ -1,38 +1,45 @@
1
- # AnnoationSecurity requires rails.
2
- # Here are some stubs to simulate a rails environment for testing.
3
- #
4
-
5
- RAILS_ROOT = ''
6
- RAILS_ENV = {}
7
-
8
- class ConfigStub
9
- def config
10
- self
11
- end
12
- end
13
-
14
- module ActiveRecord
15
- class Observer
16
- def self.observe(*args)
17
- end
18
- end
19
- end
20
-
21
- module ActionController
22
- class Base
23
- def render(*args)
24
- end
25
- def redirect_to(*args)
26
- end
27
- end
28
- module Routing
29
- class Routes
30
- end
31
- end
32
- module Filters
33
- class Filter
34
- end
35
- class AroundFilter < Filter
36
- end
37
- end
1
+ # AnnoationSecurity requires rails.
2
+ # Here are some stubs to simulate a rails environment for testing.
3
+ #
4
+
5
+ class Rails
6
+ def root
7
+ Pathname.new('')
8
+ end
9
+
10
+ def env
11
+ return {}
12
+ end
13
+ end
14
+
15
+ class ConfigStub
16
+ def config
17
+ self
18
+ end
19
+ end
20
+
21
+ module ActiveRecord
22
+ class Observer
23
+ def self.observe(*args)
24
+ end
25
+ end
26
+ end
27
+
28
+ module ActionController
29
+ class Base
30
+ def render(*args)
31
+ end
32
+ def redirect_to(*args)
33
+ end
34
+ end
35
+ module Routing
36
+ class Routes
37
+ end
38
+ end
39
+ module Filters
40
+ class Filter
41
+ end
42
+ class AroundFilter < Filter
43
+ end
44
+ end
38
45
  end
metadata CHANGED
@@ -1,105 +1,102 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: annotation_security
3
- version: !ruby/object:Gem::Version
4
- version: 1.0.2
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 3
8
+ - 1
9
+ version: 1.3.1
6
10
  platform: ruby
7
- authors:
11
+ authors:
8
12
  - Nico Rehwaldt, Arian Treffer
9
13
  autorequire:
10
14
  bindir: bin
11
15
  cert_chain: []
12
- date: 2013-03-23 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
16
+
17
+ date: 2010-11-19 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: action_annotation
16
- requirement: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: 1.0.1
22
- type: :runtime
23
22
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
23
+ requirement: &id001 !ruby/object:Gem::Requirement
25
24
  none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 1
30
+ - 0
31
+ - 1
29
32
  version: 1.0.1
30
- - !ruby/object:Gem::Dependency
31
- name: activesupport
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ! '>='
36
- - !ruby/object:Gem::Version
37
- version: 2.3.18
38
33
  type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: activesupport
39
37
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
38
+ requirement: &id002 !ruby/object:Gem::Requirement
41
39
  none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: 2.3.18
46
- - !ruby/object:Gem::Dependency
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 2
45
+ - 3
46
+ - 5
47
+ version: 2.3.5
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
47
51
  name: rspec
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: 1.3.2
54
- type: :development
55
52
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: 1.3.2
62
- - !ruby/object:Gem::Dependency
63
- name: mocha
64
- requirement: !ruby/object:Gem::Requirement
53
+ requirement: &id003 !ruby/object:Gem::Requirement
65
54
  none: false
66
- requirements:
67
- - - ! '>='
68
- - !ruby/object:Gem::Version
69
- version: 0.9.8
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ segments:
59
+ - 1
60
+ - 2
61
+ - 0
62
+ version: 1.2.0
70
63
  type: :development
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: mocha
71
67
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
68
+ requirement: &id004 !ruby/object:Gem::Requirement
73
69
  none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ segments:
74
+ - 0
75
+ - 9
76
+ - 8
77
77
  version: 0.9.8
78
- description: AnnotationSecurity provides a role based security model with automated
79
- rule evaluation for Ruby on Rails. It allows you to define user-resource-relations
80
- and rights in separate files, keeping your controllers and views free from any security
81
- logic. See the gem's homepage for an example.
78
+ type: :development
79
+ version_requirements: *id004
80
+ description: AnnotationSecurity provides a role based security model with automated rule evaluation for Ruby on Rails. It allows you to define user-resource-relations and rights in separate files, keeping your controllers and views free from any security logic. See the gem's homepage for an example.
82
81
  email: ruby@nixis.de
83
- executables:
82
+ executables:
84
83
  - annotation_security
85
84
  extensions: []
86
- extra_rdoc_files:
87
- - README.md
88
- - LICENSE
89
- - CHANGELOG.md
90
- - HOW-TO.md
91
- files:
92
- - CHANGELOG.md
93
- - LICENSE
94
- - README.md
95
- - HOW-TO.md
85
+
86
+ extra_rdoc_files:
87
+ - README
88
+ - MIT-LICENSE
89
+ - CHANGELOG
90
+ - HOW-TO
91
+ files:
92
+ - CHANGELOG
93
+ - MIT-LICENSE
94
+ - README
95
+ - HOW-TO
96
96
  - Rakefile
97
97
  - bin/annotation_security
98
98
  - lib/annotation_security/exceptions.rb
99
99
  - lib/annotation_security/exec.rb
100
- - lib/annotation_security/filters.rb
101
- - lib/annotation_security/includes/action_controller.rb
102
- - lib/annotation_security/includes/active_record.rb
103
100
  - lib/annotation_security/includes/helper.rb
104
101
  - lib/annotation_security/includes/resource.rb
105
102
  - lib/annotation_security/includes/role.rb
@@ -109,21 +106,30 @@ files:
109
106
  - lib/annotation_security/manager/relation_loader.rb
110
107
  - lib/annotation_security/manager/resource_manager.rb
111
108
  - lib/annotation_security/manager/right_loader.rb
112
- - lib/annotation_security/model_observer.rb
113
109
  - lib/annotation_security/policy/abstract_policy.rb
114
110
  - lib/annotation_security/policy/abstract_static_policy.rb
115
111
  - lib/annotation_security/policy/all_resources_policy.rb
116
112
  - lib/annotation_security/policy/rule.rb
117
113
  - lib/annotation_security/policy/rule_set.rb
114
+ - lib/annotation_security/rails/2/extensions/filter.rb
115
+ - lib/annotation_security/rails/2/includes/action_controller.rb
116
+ - lib/annotation_security/rails/2/includes/active_record.rb
117
+ - lib/annotation_security/rails/2/initializer.rb
118
+ - lib/annotation_security/rails/2/model_observer.rb
119
+ - lib/annotation_security/rails/3/extensions/filter.rb
120
+ - lib/annotation_security/rails/3/includes/action_controller.rb
121
+ - lib/annotation_security/rails/3/includes/active_record.rb
122
+ - lib/annotation_security/rails/3/initializer.rb
123
+ - lib/annotation_security/rails/3/model_observer.rb
124
+ - lib/annotation_security/rails/extensions/action_controller.rb
125
+ - lib/annotation_security/rails/extensions/active_record.rb
126
+ - lib/annotation_security/rails/extensions/object.rb
127
+ - lib/annotation_security/rails/extensions.rb
128
+ - lib/annotation_security/rails/filters.rb
118
129
  - lib/annotation_security/rails.rb
119
130
  - lib/annotation_security/user_wrapper.rb
120
131
  - lib/annotation_security/utils.rb
121
- - lib/annotation_security/version.rb
122
132
  - lib/annotation_security.rb
123
- - lib/extensions/action_controller.rb
124
- - lib/extensions/active_record.rb
125
- - lib/extensions/filter.rb
126
- - lib/extensions/object.rb
127
133
  - lib/security_context.rb
128
134
  - spec/annotation_security/exceptions_spec.rb
129
135
  - spec/annotation_security/includes/helper_spec.rb
@@ -151,29 +157,37 @@ files:
151
157
  - assets/config/security/relations.rb
152
158
  - assets/config/security/rights.yml
153
159
  - assets/vendor/plugins/annotation_security/init.rb
154
- homepage: http://github.com/Nikku/annotation_security
160
+ has_rdoc: true
161
+ homepage: http://tech.lefedt.de/2010/3/annotation-based-security-for-rails
155
162
  licenses: []
163
+
156
164
  post_install_message:
157
165
  rdoc_options: []
158
- require_paths:
166
+
167
+ require_paths:
159
168
  - lib
160
- required_ruby_version: !ruby/object:Gem::Requirement
169
+ required_ruby_version: !ruby/object:Gem::Requirement
161
170
  none: false
162
- requirements:
163
- - - ! '>='
164
- - !ruby/object:Gem::Version
165
- version: '0'
166
- required_rubygems_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ segments:
175
+ - 0
176
+ version: "0"
177
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
178
  none: false
168
- requirements:
169
- - - ! '>='
170
- - !ruby/object:Gem::Version
171
- version: '0'
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ segments:
183
+ - 0
184
+ version: "0"
172
185
  requirements: []
186
+
173
187
  rubyforge_project:
174
- rubygems_version: 1.8.23
188
+ rubygems_version: 1.3.7
175
189
  signing_key:
176
190
  specification_version: 3
177
- summary: A role based security model for rails applications with descriptive definitions
178
- and automated evaluation.
191
+ summary: A role based security model for rails applications with descriptive definitions and automated evaluation.
179
192
  test_files: []
193
+
data/CHANGELOG.md DELETED
@@ -1,14 +0,0 @@
1
- Changelog
2
- =========
3
-
4
- 1.0.2
5
- -----
6
-
7
- * dropped rails 2.3.8 support in favour of rails 2.3.18 support
8
- * updated docs
9
-
10
-
11
- 1.0.1
12
- -----
13
-
14
- * first public release
data/HOW-TO.md DELETED
@@ -1,275 +0,0 @@
1
- # How to secure your Rails application with Annotation Security
2
-
3
- ## Step 0: Install Annotation Security
4
-
5
- Annotation Security comes as a gem hosted on rubygems.org. You can install it
6
- via `gem install annotation_security`.
7
- The gem contains a binary called `annotation_security`. It can be used to
8
- install the security layer into a rails app via
9
- `annotation_security --rails RAILS_HOME`. This will make your app ready to be
10
- secured.
11
-
12
- ### Version Notes
13
-
14
- Use the gem version < 2 for Rails 2.3.x applications.
15
- Use the gem version 3.x for Rails 3.x applications.
16
-
17
- ## Step 1: Defining user and roles
18
-
19
- Annotation Security assumes that there is a user class, representing the user,
20
- and some role classes containing additional information if the user has a
21
- certain role in the application.
22
-
23
- If you don't have user or role classes in your application,
24
- continue with step 2.
25
-
26
- ### User
27
-
28
- In most cases the user class will be a subclass of `ActiveRecord::Base`,
29
- but this is not necessary.
30
-
31
- Include the `module AnnotationSecurity::User` into this class.
32
-
33
- class User < ActiveRecord::Base
34
- include AnnotationSecurity::User
35
- ...
36
-
37
- ### Roles
38
-
39
- Include the module `AnnotationSecurity::Role` into these classes. If you are
40
- having a hierachy of role classes, only include the module in the topmost class.
41
-
42
- class Role < ActiveRecord::Base
43
- belongs_to :user
44
- include AnnotationSecurity::Role
45
- ...
46
-
47
- class Student < Role
48
- # no include here
49
- ...
50
-
51
- A role object should respond to `user` with returning the user object
52
- it belongs to.
53
-
54
- __Do not include both modules in one class!__
55
-
56
- ### Connecting user and roles
57
-
58
- As next, you should provide some default methods for accessing the roles
59
- of a user. You can skip this step, but it will be helpfull later on.
60
-
61
- There are two types of access methods: `is_ROLE?` and `as_ROLE`.
62
-
63
- IS-methods return true or false whether a user has a role or not.
64
-
65
- class User < ActiveRecord::Base
66
- def is_administrator?
67
- self.admin_flag == 1
68
- end
69
-
70
- def is_student?
71
- self.roles.any? { |role| role.is_a? Student }
72
- end
73
- ...
74
-
75
- AS-methods return a single object or an array of objects representing the role.
76
- If the user does not have the role, the result should be an empty array or nil.
77
-
78
- class User < ActiveRecord::Base
79
- def as_administrator
80
- # there is no administrator class, just return the user
81
- is_administrator? ? self : nil
82
- end
83
-
84
- def as_student
85
- # assuming a user can only be student once
86
- self.roles.detect { |role| role.is_a? Student }
87
- end
88
-
89
- def as_corrector
90
- # assuming a user can be a corrector several times
91
- self.roles.select { |role| role.is_a? Corrector }
92
- end
93
-
94
- ## Step 2: Providing the current credential
95
-
96
- To evaluate the security policies, for each request the current credential has
97
- to be provided. Therefore, a new filter type was introduced: security filters
98
- are around filters that are always the first in the filter chain. You can also
99
- use these filters to react to security violations.
100
-
101
- In this example, the user is simply fetched from the session. However, you
102
- could also pass a symbol or a string (e.g. if you are using API-keys).
103
-
104
- Passing `nil` will be interpreted as not being authenticated in any way.
105
-
106
- class ApplicationController < ActionController::Base
107
-
108
- security_filter :security_filter
109
-
110
- private
111
-
112
- def security_filter
113
- SecurityContext.current_credential = session[:user]
114
- yield
115
- rescue SecurityViolationError
116
- if SecurityContext.is? :logged_in
117
- render :template => "welcome/not_allowed"
118
- else
119
- render :template => "welcome/please_login"
120
- end
121
- end
122
-
123
- Please notice that once set, the credential cannot be changed.
124
-
125
- ## Step 3: Defining your resources
126
-
127
- Another wild assumption we made is that your application contains some resources
128
- you want to protect. In most cases, this will be your ActiveRecord classes.
129
- To turn them into resources, just call `resource(symbol)` in the class
130
- definition.
131
-
132
- class Course < ActiveRecord::Base
133
- resource :course
134
- ...
135
-
136
- The symbol is used to further identify this class and should be unique.
137
-
138
- It is possible (and likely) that the users and roles are resources as well.
139
-
140
- If you want to restrict access to other resource classes, see
141
- `AnnotationSecurity::Resource` for more information.
142
-
143
- ## Step 4: Defining relations and rights
144
-
145
- in `config/security` you will find the files `relations.rb` and
146
- `rights.yml`.
147
-
148
- ### Relations
149
-
150
- The relations between the user (or the roles) and the resources are defined
151
- as code blocks, that evaluate to true or false.
152
-
153
- The `:as`-flag causes that instead of the user object, a role object
154
- will be passed into the block (using the `as_ROLE`-method from above).
155
- Similar, the `:is`-flag can be used as precondition.
156
-
157
- AnnotationSecurity.define_relations do
158
- resource :course do
159
- enrolled :as => :student { |student,course| course.students.include? student }
160
- corrector :as => :corrector { |corrector,course| corrector.corrects? course }
161
- lecturer :as => :lecturer { |lecturer,course| lecturer.lectures? course }
162
- end
163
- ...
164
-
165
- You can also define relations that are valid for all resources.
166
-
167
- all_resources do
168
- # corrector and lecturer are defined by the resource
169
- responsible { corrector or lecturer }
170
- # no block required here
171
- administrator :is => :administrator
172
- end
173
-
174
- For more details and features on defining relations,
175
- see `AnnotationSecurity::RelationLoader`.
176
-
177
- ### Rights
178
-
179
- The rights of application are specified in a YAML-file, they correspond to the
180
- actions(not necessarily the controller actions) that can be performed on a
181
- resource. For instance, to edit a course object, you will need the edit-right
182
- for the course resource. If you are not sure which rights your application
183
- needs, just skip this now and return after step 5.
184
-
185
- Rights should be valid ruby conditional statements.
186
-
187
- course:
188
- create: if lecturer
189
- show: if enrolled or responsible
190
- edit: if responsible
191
-
192
- AnnotationSecurity provides two default relations: `logged_in`, that is true
193
- if there is a user at all, and +self+, that can be used to determine if a user
194
- or role resource belongs to the current user.
195
-
196
- user:
197
- register: unless logged_in
198
- show: if logged_in
199
- edit: if self or administrator
200
- student:
201
- show_results: if self
202
-
203
- To improve readability, you can append 'may', 'is', 'can' or 'has' as prefix and
204
- 'for', 'in', 'of' or 'to' as suffix to the relation name.
205
- This is especially recommended if you are defining rights that depend on
206
- other rights of the resource.
207
-
208
- assignment:
209
- edit: if responsible
210
- delete: if may_edit
211
-
212
- Another example can be found at `AnnotationSecurity::RightLoader`.
213
-
214
- ## Step 5: Securing your actions
215
-
216
- The main goal of AnnotationSecurity was to remove security logic from
217
- controller actions. Now you only have to define the abstract effects of an
218
- action.
219
-
220
- An action performs one or more tasks on different resources. You have to provide
221
- this information as a descriptions, using the
222
- [Action Annotation Gem](http://github.com/Nikku/action_annotation).
223
- A description always has the form 'ACTION on RESOURCE'.
224
-
225
- desc 'shows a course'
226
- def show
227
- @course = Course.find(params[:id])
228
- end
229
-
230
- To perform a task, the user must have the right for it. Thus, when a course is
231
- fetched from the database during the show-action, the right course/show will be
232
- evaluated for the current user and the course instance.
233
-
234
- In our example, the user has to be responsible or enrolled. If both relations
235
- evaluate to false, the right is not given and access will be denied by raising
236
- a SecurityViolationError, which will then be catched in the security filter.
237
-
238
- Congratulations, you Rails application is secured now.
239
-
240
- ## Step 6: Securing your views
241
-
242
- However, actions aren't the only place with security code. Links to the actions
243
- are shown in the view and very often, the view itself depends on the
244
- user's rights.
245
-
246
- When setting up Annotation Security in your Rails project, a helper will be
247
- included automatically. The most important functions this helper provides are
248
- `allowed?` and `link_to_if_allowed`.
249
-
250
- The method `allowed?` expects a right and a resource and returns true iif
251
- the current user has that right.
252
-
253
- <% unless allowed? :edit, @course %>
254
- <p>You may not edit this course!</p>
255
- <% end %>
256
-
257
- `link_to_if_allowed` expects the same arguments as +link_to+, except it also
258
- expects a block like +link_to_if+ (which will be called internally).
259
-
260
- <%= link_to_if_allowed("New", new_course_path) { "You may not create a new course." } %>
261
- <%= link_to_if_allowed("Edit", edit_course_path(@course)) { } %>
262
- <%= link_to_if_allowed("Delete", @course, {:method => :delete}) { } %>
263
-
264
- `link_to_if_allowed` tries to automatically detect the accessed resources.
265
- In case this should not work for you, see `AnnotationSecurity::Helper` for more
266
- features.
267
-
268
- ## Step 7: Live long and prosper
269
-
270
- Well, that's it. Here are some additional notes:
271
-
272
- * in development mode, the rights and relations are reloaded with every request.
273
- * See `AnnotationSecurity::RelationLoader` and `AnnotationSecurity::RightLoader`
274
- for more examples and features for defining relations and rights.
275
- * See `AnnotationSecurity::Helper` for more methods for securing your views.