2011-12-22 10 views
7

ho iniziato ad usare il pattern MVC un anno e mezzo fa, e ho ancora alcune incomprensioni.Ruolo - corretto pattern MVC

Ora voglio implementare un controllo degli accessi basato sul ruolo nella mia applicazione. Tuttavia, la mia domanda non riguarda RBAC, riguarda MVC.

mia implementazione di RBAC è questo: user-> role> permesso in modo che ogni utente (ex userA.) Può avere molti ruoli, e ogni ruolo può (ex lettore, redattore, amministratore.) avere molte autorizzazioni (leggi, aggiorna, cancella, ecc.).

tabelle MySQL

  • utenti (elenco di utenti)
  • ruoli (elenco dei ruoli)
  • permessi (lista di permesso)
  • roles_permissions (elenco di Roles-> connessioni autorizzazioni .ex. editor-> update)
  • users_roles (elenco utenti-> connessioni ruoli. ex. utenteA-> editor)

Ora la mia domanda è Come devo implementare questo in MVC? hanno un modello separato per: utenti, ruoli, autorizzazioni, roles_permissions, users_roles, di avere una classe AuthManager che crea gli utenti, ruoli, autorizzazioni, roles_permissions, e user_roles? È questo il modo corretto? Esiste un modo migliore, forse più elegante?

risposta

8

Fondamentalmente mi basterei con una delle tante librerie ACL Kohana già esistenti invece di scriverne una (o almeno provarle per vedere se si adattano alle vostre esigenze).

Si consiglia di verificare questa discussione (Wouter A1, A2 e ACL moduli) - http://forum.kohanaframework.org/discussion/1988/releases-a1-authentication-acl-acl-for-kohana-a2-object-level-authorization/p1
E 'costantemente aggiornato e mantenuto ed è disponibile per la versione 3.2 pure.

Se ti senti moduli Wouter sono complicate, è anche possibile controllare il modulo Vendo ACL che è molto semplice e rimuove un sacco di complicazioni - https://github.com/vendo/acl
Esempi Come utilizzare esso - http://forum.kohanaframework.org/discussion/9517/getting-started-with-vendo-acl/p1

2

sarete in genere desidera utilizzare un ACL libreria/classe per questo dal momento che è ACL si sta descrivendo. Non so Kohana ma da una rapida google ho trovato questa libreria Kohana ACL. https://github.com/synapsestudios/kohana-acl

Ma fondamentalmente avrete bisogno di modelli per gestire le vostre entità separate nelle librerie ACL come utenti, ruoli e permessi. Poi parlare con l'ACL-API nel controller o altre librerie per determinare l'accesso a particolari parti della vostra app.

1

Copia/incolla il codice del controller principale dell'applicazione KohanaPHP supponendo che Zend_ACL sia già incluso.

Si noti che dispongo di autorizzazioni basate sull'utente, non di una basata su gruppi ... Anche se può essere facilmente modificata.

<?php 

defined('SYSPATH') OR exit('No direct script access.'); 

class Controller_Application extends Controller_Template 
{ 

    protected static $acl; 
    public $template = 'default'; 

    public function before() 
    { 
     parent::before(); 
     session_start(); 
     self::$acl = new Zend_Acl(); 
     $this->set_permissions($_SESSION['userid']); 
    } 

    protected function check_access($resource, $privilege, $redirect = TRUE) 
    { 
     $permission = (self::$acl->has($resource) AND self::$acl->isAllowed($_SESSION['userid'], $resource, $privilege)); 
     if (!$permission AND $redirect) 
      $this->request->redirect('user/denied'); 
     elseif (!$permission AND !$redirect) 
      return FALSE; 
     elseif ($permission AND !$redirect) 
      return TRUE; 
    } 

    protected function set_permissions($user_id) 
    { 
     $result = DB::select() 
      ->from('permissions') 
      ->where('user_id', '=', $user_id) 
      ->execute() 
      ->as_array(); 
     self::$acl->addRole(new Zend_Acl_Role($user_id)); 
     foreach ($result AS $permission) 
     { 
      if (!self::$acl->has($permission['resource'])) 
       self::$acl->add(new Zend_Acl_Resource($permission['resource'])); 
      self::$acl->allow($user_id, $permission['resource'], $permission['privilege']); 
     } 
    } 
} 

?> 

Quindi controllo l'accesso in controller come questo: $this->check_access('events', 'add');.

1

So che la pista è fredda , ma è comparso un nuovo progetto:

PHP-RBAC è un controllo di accesso basato su ruoli standard di livello 2 gerarchico NIST di livello 2 ed è piuttosto maturo. È anche un progetto OWASP.

spero che vi piaccia a http://phprbac.net

è usato in jframework in un modo che è il modo standard di incorporare RBAC in un pattern MVC.