-
-
Notifications
You must be signed in to change notification settings - Fork 90
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Dependent policy loses track of dependee failure reason #50
Comments
Yeah, that's a tricky thing. I have an idea which solves this particular case (but not sure that's it's clear):
Example: class DependeePolicy
def do_it?
check?(:a?) && check?(:b?)
end
def do_that?
b? || c?
end
def a?
true
end
def b?
false
end
def c?
false
end
end
class DependerPolicy
def do_it?
check?(:do_it?, record.dependee) && check?(:c?)
end
def do_that?
check?(:do_that?, record.dependee) || check?(:d?)
end
def c?
true
end
def d?
false
end
end
# first case: self-check
begin
authorize! dependee, to: :do_it?
rescue ActionPolicy::Unauthorized => e
puts e.result.reasons.details # { :dependee => [:b?] }
end
# 1: self-check
begin
authorize! dependee, to: :do_it?
rescue ActionPolicy::Unauthorized => e
puts e.result.reasons.details # { :dependee => [:b?] }
end
# 2: no checks
begin
authorize! dependee, to: :do_that?
rescue ActionPolicy::Unauthorized => e
puts e.result.reasons.details # {}
end
# 3: sub-policy check with sub-checks
begin
authorize! depender, to: :do_it?
rescue ActionPolicy::Unauthorized => e
puts e.result.reasons.details # { :dependee => [:b?] }
end
# 3: sub-policy check without sub-checks
begin
authorize! depender, to: :do_that?
rescue ActionPolicy::Unauthorized => e
# NOTE: we use dependee rule as reason, 'cause no reasons were populated in sub-call
puts e.result.reasons.details # { :dependee => [:do_that?], :depender => [:d?] }
end |
Apologies for the late reply. |
Reasons are only populated when External The idea of reasons is to specify the failure cause more precisely and not to replace the top-level "reason" (i.e. a rule that failed). We use both begin
authorize! dependee, to: :do_it?
rescue ActionPolicy::Unauthorized => e
msg = e.result.message
if e.result.reasons.any?
msg << ": #{e.result.reasons.full_messages.map(&:downcase).join(', ')}"
end
puts msg
end |
Thank you for the clarification! |
Running from master, with ruby 2.5.3 and rails 5.2.1.
If I have two policies, one of which is dependent on the other:
Sometimes I authorize the Dependee on its own:
Sometimes I authorize the Depender instead, but:
I would expect the reason to still be
{ :dependee => [:b?] }
, or a chain of failures{ :depender => [:do_it?], dependee => [:do_it?, :b?] }
. We lose track on the underlying real reason otherwise, especially for i18n messages.(Awesome gem by the way!)
The text was updated successfully, but these errors were encountered: