LRDesign / LogicalAuthz

Authorization framework for Rails apps

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

LogicalAuthz
============

Provides simple, fast group based Authorization facilities for Rails apps.

Example
=======

class MyController
  needs_authorization :show, :index #other actions available to anyone
  #needs_authorization <- this form makes the whole controller authorized

  def show
    ...
  end
end

in spec/controller/my_controller_spec.rb:

require 'logical_authz/spec_helper'
describe MyController do
  before do
  end
  it "should require authorization" do
    get :show
    controller.should_not be_authorized
  end

  describe "accessed by an authorized user" do
    before do
      login_as_authorized #whatever that means
    end

    it "should accept authorization" do
      controller.should be_authorized
    end
  end
end

in app/views/my_view.html.haml
- if authorized?(:action => show)
  = show_my_url("Show")
- else
  Show

What You Get
============
An authorization filter for controllers
Some handy class method DSL action to adding the filter and controlling which 
methods it applies to:

needs_authorization(optional_array_of_actions) #or else the whole controller
grant_aliases(:edit => [:update, :show]) #because if I can edit, I should be i      
                                         #able to see it
dynamic_authorization do |criteria|
  whatever #Allows complete control over hardcoded authorization
end
admin_authorized(:optional, :actions) #shortcut for "Admin is always allowed"

A couple of view helpers:
authorized?(:controller => "name", :user => current_user, :action => :edit) 

The fundamental authorization method:
LogicalAuthz::is_authorized(:controller => "...", :group => "...", :action => 
"...", :id => "...") # :user => '' will be translated in the user's groups.

A set of spec matchers: authorized and forbidden.

The Authorization Model
=======================

A permission related the following things: a group, a controller, an action, 
and a id.  If a permission exists, it means that members of the group are 
allowed to perform the controller#action with that params[:id].

id is allowed to be nil, in which case members of the group are allowed to 
perform that controller#action on any id.  Very useful for Post#create for 
instance.

action is allowed to be nil, in which case members of the group are allowed to 
perform any action on the controller.

Getting Started
===============

script/plugin install git@github.com:LRDesign/LogicalAuthz.git

script/generate logical_authz_models -u User #<= this needs to be the name of your user model
rake logical_authz:setup #<= adds some stuff to the end of db/seeds.rb

edit the migrations to align them with your project - feel free to leave it alone
edit config/initializers/authz.rb
edit db/seeds.rb to add:
require 'db/logical_authz_seeds'
... and to create any permissions you want to start with

In your ApplicationController add:
  include LogicalAuthz::Application

Gotchas
=======

LogicalAuthz uses flash to pass information about about authorization between
controllers - as a result, if you're using a lazy flash display layout, you'll
display a bunch of junk to the user.  Our opinion is that you should probably 
only be automatically displaying :notice, :info, and :error to the user, but 
regardless, the flash hash is too useful to only use for displaying information 
to the user.

If you don't already have a Group model, LogicalAuthz provides one.  If you do, 
the generator may currently give you some headaches - the plan is to split out 
the individual models and allow some of them to be omitted.  In the meantime, 
either you could generate a different group (-g) and reconcile the result, or 
remove the class_colision line from the generator.

Copyright (c) 2010 Judson Lester and Logical Reality Design, released under the MIT license

About

Authorization framework for Rails apps

License:MIT License


Languages

Language:Ruby 100.0%