module DeviseRestfulAuth::InstanceMethods

Public Instance Methods

validate_permissions(item_type=nil) click to toggle source

@role_id cerca di abbreviare la ricerca, nel caso i permessi siano dati in base al ruolo, si prova a desumere dai nomi delle classi coinvolte @item_type serve per sapere per quale classe si valida. se vuoto si prova a desumere dai nomi delle classi coinvolte @subject_type serve per sapere chi è l’oggetto per il quale si cerca il permesso se item o subject sono qualsiasi, si specifica ‘any’ nel controller e viene settato il valore nil per la ricerca sul db se item e subject sono la stessa classe, la convenzione è di chiamare il model che mappa i ruoli come SubjectSubjectRole. verrà usata la chiave subject_id per il soggetto indipendentemente dalla classe.

# File lib/devise_restful_auth/validate_auth.rb, line 23
    def validate_permissions(item_type=nil)
      @item_type||=item_type if item_type
      controller= self.request.params[:controller]
      action= self.request.params[:action]
      if @item_type.nil?
        @item_type=controller.singularize.camelize
      elsif @item_type.eql?'any'
        @item_type=nil
      end
      #try to infer @item_id if nil (nil means any here and will be considered)
      if @item_id.nil?
        if eval(@item_type).is_a? Class
          begin
            @item=eval(@item_type).find(params[:id]) if params[:id]
            @item_id=@item.id unless @item.nil?
          rescue => e
            
            @item_id=nil
          end
        end
      end
      if @subject_type.nil?
        @subject_type="User"
        @subject_id=current_user.id if current_user
      elsif @subject_type.eql?'any'
        @subject_type=nil
      end
      
      if @role_id.nil?
        begin
          @permission_model=(eval("#{@subject_type}"+"#{@item_type}"+"Role").is_a? Class)
        rescue =>e
#         logger debug.e
        end
        
        if @subject_type and @item_type and @permission_model 
          
          if @subject_type.eql?@item_type
            
            @roles=eval("#{@subject_type}"+"#{@item_type}"+"Role").all
            
            if !@roles.empty?
              @subject_roles=@roles.find_all { |e| [nil,@subject_id].include? e[:subject_id] }
            end
            
          else
            
            begin
              @subject_roles=eval("#{@subject_type}"+"#{@item_type}"+"Role").all(:conditions=>{"#{@subject_type.parameterize}_id".to_sym=>@subject_id})
            rescue => e
              
            end
          end
          @subject_roles||=[]
          
          begin
            if !@subject_roles.empty?
              
              @sr=@subject_roles.find_all { |i| [nil,@item_id].include? i[:item_id] }
              
              @role_ids=@sr
            end
          rescue => e
            
          end
          @role_type="Role"
        end
        @role_ids||=[]
      end
      if eval("Permission").is_a? Class
        p=Permission.first(:conditions=>{:controller=>controller,:action=>action})
        if p
          
          @role_ids.each do |user_role|
            
            @role_permissions=SubjectPermission.all(:conditions=>["subject_id=? and subject_type=? and permission_id=? and (item_type=? or item_type='')",user_role.role.id,@role_type,p.id,@item_type])
            if !@role_permissions.empty?
              
              @rps=@role_permissions.find_all { |rp| [nil,@item_id].include? rp[:item_id]}
            end
            @rps||=[]  
            
            @rps.each do |sp|
              
            end
            if !@rps.empty? 
             return 
            end
          end
          
            @subject_permissions_on_items=SubjectPermission.all(:conditions=>["(item_type=? or item_type='') and permission_id=? and subject_id=? and subject_type=?",@item_type,p.id,@subject_id,@subject_type])
          
          if !@subject_permissions_on_items.empty?
            @ups=@subject_permissions_on_items.find_all { |u| [nil,@item_id].include? u[:item_id]}
          end
          if @ups
               return
          else
            
            flash[:error]="accesso negato perché non esiste un permesso né per l'utente, né per il suo ruolo, su #{controller}/#{action} per #{@item_type}:#{@item_id}"
            redirect_to root_url and return
          end
        else
          
          
          flash[:error]="accesso negato perché è presente la validazione per questa operazione (<strong>#{controller}/#{action}</strong>), ma non esistono permessi associati"
          redirect_to root_url and return
        end
      end
    end