module Lipsiadmin
module AccessControl
# This provide a simple login for backend and frontend.
# Use backend_login_required in backend and
# frontend_login_requirded in frontend.
#
# Examples:
#
# class FrontendController < ApplicationController
# before_filter :frontend_login_required, :except => [:login]
# end
#
module Authentication
protected
# Returns true if current_account is logged and active.
def logged_in?
current_account != :false && current_account.active?
end
# Returns the current_account, it's an instance of Account model
def current_account
@current_account ||= (login_from_session || :false)
end
# Ovverride the current_account, you must provide an instance of Account Model
#
# Examples:
#
# current_account = Account.last
#
def current_account=(new_account)
session[:account] = (new_account.nil? || new_account.is_a?(Symbol)) ? nil : new_account.id
@current_account = new_account
end
# Returns true if the current_account is allowed to see the requested
# controller/action.
#
# For configure this role please refer to: Lipsiadmin::AccessControl::Base
def allowed?
allowed = current_account.maps.collect(&:allowed)[0]
denied = current_account.maps.collect(&:denied)[0]
allow = allowed.find do |a|
a[:controller] == params[:controller] &&
(a[:action].blank? || a[:action] == params[:action])
end
deny = denied.find do |a|
a[:controller] == params[:controller] &&
(a[:action].blank? || a[:action] == params[:action])
end
return allow && !deny
end
# Returns a helper to pass in a before_filter for check if
# an account are: logged_in? and allowed?
#
# By default this method is used in BackendController so is not necessary
def backend_login_required
logged_in? && allowed? || access_denied(:backend)
end
# Returns a helper to pass in a before_filter for check if
# an account are: logged_in? and allowed?
#
# Examples:
#
# before_filter :frontend_login_required, :except => [:some]
#
def frontend_login_required
logged_in? && allowed? || access_denied(:frontend)
end
def access_denied(where)#:nodoc:
respond_to do |format|
format.html { redirect_to :controller => "#{where}/sessions", :action => :new }
format.js { render(:update) { |page| page.alert "You don't allowed to access to this javascript" } }
end
false
end
def store_location#:nodoc:
session[:return_to] = request.request_uri
end
# Redirect the account to the page that requested an authentication or
# if the account is not allowed/logged return it to a default page
def redirect_back_or_default(default)
redirect_to(session[:return_to] || default)
session[:return_to] = nil
end
def self.included(base)#:nodoc:
base.send :helper_method, :current_account, :logged_in?
end
def login_from_session#:nodoc:
self.current_account = Account.find_by_id(session[:account]) if session[:account]
end
end # Module Authentication
end # Module AccessControl
end # Module Backend