1234567891011121314151617181920212223242526272829303132 |
- # We need a special UserContext when authorizing in controller context
- # because of Token authentication which has it's own permissions
- # See: https://github.com/varvet/pundit#additional-context
- # We use a Delegator here to have transparent / DuckType access
- # to the underlying User instance in the Policy
- class UserContext < Delegator
- def initialize(user, token)
- @user = user
- @token = token
- end
- def __getobj__
- @user
- end
- def permissions!(permissions)
- raise Exceptions::NotAuthorized, 'authentication failed' if !@user
- raise Exceptions::NotAuthorized, 'Not authorized (user)!' if !@user.permissions?(permissions)
- return if !@token
- return if @token.with_context(user: @user) { permissions?(permissions) }
- raise Exceptions::NotAuthorized, 'Not authorized (token)!'
- end
- def permissions?(permissions)
- permissions!(permissions)
- true
- rescue Exceptions::NotAuthorized
- false
- end
- end
|