module Tuersteher::ControllerExtensions
Module zum Include in Controllers Dieser muss die folgenden Methoden bereitstellen:
login_context : akt. Login-Contex access_denied : Methode aus dem authenticated_system, welche ein redirect zum login auslöst
Der Loginlogin_contex muss fuer die hier benoetigte Funktionalitaet die Methode:
has_role?(role) # role the Name of the Role as Symbol
besitzen.
Beispiel der Einbindung in den ApplicationController
include Tuersteher::ControllerExtensions before_filter :check_access # methode is from Tuersteher::ControllerExtensions
Public Class Methods
# File lib/tuersteher.rb, line 303 def self.included(base) base.class_eval do # Diese Methoden auch als Helper fuer die Views bereitstellen if(self.respond_to?(:helper_method)) helper_method :path_access?, :model_access?, :purge_collection end end end
Public Instance Methods
Pruefen Zugriff auf ein Model-Object
model das Model-Object permission das geforderte Zugriffsrecht (:create, :update, :destroy, :get)
liefert true/false
# File lib/tuersteher.rb, line 290 def model_access? model, permission AccessRules.model_access? login_context, model, permission end
Pruefen Zugriff fuer eine Web-action
path Pfad der Webresource (String) method http-Methode (:get, :put, :delete, :post), default ist :get
# File lib/tuersteher.rb, line 280 def path_access?(path, method = :get) AccessRules.path_access? login_context, path, method end
Bereinigen (entfernen) aller Objecte aus der angebenen Collection, wo der akt. login_context nicht das angegebene Recht hat
liefert ein neues Array mit den Objecten, wo der spez. Zugriff arlaubt ist
# File lib/tuersteher.rb, line 298 def purge_collection collection, permission AccessRules.purge_collection(login_context, collection, permission) end
Protected Instance Methods
Pruefen, ob Zugriff des login_context fuer aktullen Request erlaubt ist
# File lib/tuersteher.rb, line 316 def check_access ar_storage = AccessRulesStorage.instance unless ar_storage.ready? # bei nicht production-env check-intervall auf 5 sek setzen ar_storage.check_intervall = 5 if Rails.env!='production' # set root-path as prefix for all path rules prefix = respond_to?(:root_path) && root_path ar_storage.path_prefix = prefix if prefix && prefix.size > 1 ar_storage.read_rules end # bind login_context on the current thread Thread.current[:login_context] = login_context req_method = request.method req_method = req_method.downcase.to_sym if req_method.is_a?(String) url_path = request.fullpath unless path_access?(url_path, req_method) lc_id = login_context && (login_context.respond_to?(:id) ? login_context.id : login_context.object_id) msg = "Tuersteher#check_access: access denied for #{url_path} :#{req_method} login_context.id=#{lc_id}" Tuersteher::TLogger.logger.warn msg logger.warn msg # log message also for Rails-Default logger access_denied # Methode aus dem authenticated_system, welche z.B. ein redirect zum login auslöst end end