README.md in jsonapi-authorization-0.6.1 vs README.md in jsonapi-authorization-0.8.0

- old
+ new

@@ -1,16 +1,31 @@ # JSONAPI::Authorization -[![Build Status](https://travis-ci.org/venuu/jsonapi-authorization.svg?branch=master)](https://travis-ci.org/venuu/jsonapi-authorization) [![Gem Version](https://badge.fury.io/rb/jsonapi-authorization.png)](http://badge.fury.io/rb/jsonapi-authorization) +[![Build Status](https://img.shields.io/travis/venuu/jsonapi-authorization/master.svg?style=flat&maxAge=3600)](https://travis-ci.org/venuu/jsonapi-authorization) [![Gem Version](https://img.shields.io/gem/v/jsonapi-authorization.svg?style=flat&maxAge=3600)](https://rubygems.org/gems/jsonapi-authorization) -`JSONAPI::Authorization` adds authorization to the [jsonapi-resources][jr] (JR) gem using [Pundit][pundit]. +**NOTE:** This README is the documentation for `JSONAPI::Authorization`. If you are viewing this at the +[project page on Github](https://github.com/venuu/jsonapi-authorization) you are viewing the documentation for the `master` +branch. This may contain information that is not relevant to the release you are using. Please see the README for the +[version](https://github.com/venuu/jsonapi-authorization/releases) you are using. -***PLEASE NOTE:*** This gem currently handles only a subset of operations available in JR. This gem is still considered to be ***alpha quality*** and therefore you shouldn't rely on it on production (yet). + --- +`JSONAPI::Authorization` adds authorization to the [jsonapi-resources][jr] (JR) gem using [Pundit][pundit]. + [jr]: https://github.com/cerebris/jsonapi-resources "A resource-focused Rails library for developing JSON API compliant servers." [pundit]: https://github.com/elabs/pundit "Minimal authorization through OO design and pure Ruby classes" +## Caveats + +Make sure to test for authorization in your application, too. We should have coverage of all operations, though. If that isn't the case, please [open an issue][issues]. + +This gem should work out-of-the box for simple cases. The default authorizer might be overly restrictive for [more complex cases][complex-case]. + +The API is subject to change between minor version bumps until we reach v1.0.0. + + [complex-case]: https://github.com/venuu/jsonapi-authorization/issues/15 + ## Installation Add this line to your application's Gemfile: ```ruby @@ -23,31 +38,47 @@ Or install it yourself as: $ gem install jsonapi-authorization +## Compatibility + +* `v0.6.x` supports JR `v0.7.x` +* `v0.8.x` supports JR `v0.8.x` + +We aim to support the same Ruby and Ruby on Rails versions as `jsonapi-resources` does. If that's not the case, please [open an issue][issues]. + ## Usage -Make sure you have a Pundit policy specified for every backing model that your JR resources use. Then hook this gem up to your application like so: +First make sure you have a Pundit policy specified for every backing model that your JR resources use. +Hook up this gem as the default processor for JR, and optionally allow rescuing from `Pundit::NotAuthorizedError` to output better errors for unauthorized requests: + ```ruby +# config/initializers/jsonapi-resources.rb JSONAPI.configure do |config| - config.operations_processor = :jsonapi_authorization + config.default_processor_klass = JSONAPI::Authorization::AuthorizingProcessor + config.exception_class_whitelist = [Pundit::NotAuthorizedError] end ``` -Make all your JR controllers specify the user in the `context` if you are using the default authorizer class (see [Configuration](#configuration) below): +Make all your JR controllers specify the user in the `context` and rescue errors thrown by unauthorized requests: ```ruby class BaseResourceController < ActionController::Base include JSONAPI::ActsAsResourceController + rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized private def context {user: current_user} end + + def user_not_authorized + head :forbidden + end end ``` Have your JR resources include the `JSONAPI::Authorization::PunditScopedResource` module. @@ -56,53 +87,32 @@ include JSONAPI::Authorization::PunditScopedResource abstract end ``` -If you want to send a custom response for unauthorized requests, add a `rescue_from` hook to your `BaseResourceController` and whitelist `Pundit::NotAuthorizedError` in your JR configuration. +## Configuration -## Known bugs +You can use a custom authorizer class by specifying a configure block in an initializer file. If using a custom authorizer class, be sure to require them at the top of the initializer before usage. -There is a bug affecting `jsonapi-resources` error whitelisting, see https://github.com/cerebris/jsonapi-resources/pull/573. To make your whitelisting and `rescue_from` to work properly, here is a potential workaround: - ```ruby -JSONAPI.configure do |config| - config.exception_class_whitelist = [Pundit::NotAuthorizedError] +JSONAPI::Authorization.configure do |config| + config.authorizer = MyCustomAuthorizer end ``` -```ruby -class BaseResourceController < ActionController::Base - rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized +## Troubleshooting - private +### "Unable to find policy" exception for a request - # https://github.com/cerebris/jsonapi-resources/pull/573 - def handle_exceptions(e) - if JSONAPI.configuration.exception_class_whitelist.any? { |k| e.class.ancestors.include?(k) } - raise e - else - super - end - end +The exception might look like this for resource class `ArticleResource` that is backed by `Article` model: - def user_not_authorized - head :forbidden - end -end ``` - -## Configuration - -You can use a custom authorizer class by specifying a configure block in an initializer file. If using a custom authorizer class, be sure to require them at the top of the initializer before usage. - -```ruby -JSONAPI::Authorization.configure do |config| - config.authorizer = MyCustomAuthorizer -end +unable to find policy `ArticlePolicy` for `Article' ``` +This means that you don't have a policy class created for your model. Create one and the error should go away. + ## Development After checking out the repo, run `bundle install` to install dependencies. Then, run `bundle exec rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org). @@ -112,5 +122,7 @@ Originally based on discussion and code samples by [@barelyknown](https://github.com/barelyknown) and others in [cerebris/jsonapi-resources#16](https://github.com/cerebris/jsonapi-resources/issues/16). ## Contributing Bug reports and pull requests are welcome on GitHub at https://github.com/venuu/jsonapi-authorization. + + [issues]: https://github.com/venuu/jsonapi-authorization/issues