@Ludvik rozpisales sie z tym kodem ;P
Wkońcu zaczełem pisać obsługe autoryzacji i mam takie cos:
<?php
class Auth {
private $perms = array(); private $groups = array(); private $cursor;
const OWN = 'OWN';
const ALL = 'ALL';
public function __construct()
{
}
public function define($name, $level=null) {
$level = isset($level) ?
self::ALL : self::OWN; $this->perms[$name] = array($name, $level); }
public function addGroup($name)
{
if(isset($this->groups[$name])) throw new AuthException('Group "'.$name.'" already exists in auth');
$this->groups[$name] = array(); $this->cursor = $name;
return $this;
}
public function addPermission($name)
{
if(!isset($this->perms[$name])) throw new AuthException('Permission "'.$name.'" not defined');
$this->groups[$this->cursor][$name] = $this->perms[$name];
return $this;
}
public function __destruct()
{
echo '<br><b>Permisssions:</b> <br>'; echo '<br><b>Groups:</b> <br>'; }
}
?>
Api dla nadawanie praw i grup wygląda tak:
<?php
try {
$auth = new Auth('newsView');
$auth->define('read', 1);
$auth->define('edit', 1);
$auth->define('write');
$auth->addGroup('quest')
->addPermission('read')
$auth->addGroup('moderator')
->addPermission('read')
->addPermission('edit')
->addPermission('write')
} catch(AposException $e)
{
}
?>
No i w moim frameworku akcje wyglądają tak że każda akcja np newsView, newsEdit to osobna klasa w osobnym pliku która dziedziczy klase abstrakcyjną akcji. No i chciałem do tego pliku z akcją dołączyć pomocniczą klase dostępu (newsViewAuth, newsViewEdit) gdzie będzie klasa dziedziczącą klasę autoryzacji do sprawdzania dostępu:
<?php
class NewsViewAuth extends AuthCheck {
public function _checkAuth()
{
$this->groupCheck('quest');
}
}
// ... klasa NewsViewAction ...
?>
W dispatherze który wywołuje obiekt odpowiedniej akcji najpierw sprawdzałbym czy dany użytkownik ma do niej prawa o potem dopiero wywoływał jej obiekt. Niewiem gdzie czymać tablice z grupami i prawami dostępu do odpowiednich akcji no i kiedy je tworzyc. User miałby swoją tablice z prawami zapisaną w bazie i przy logowaniu zapisze ją do $_SESSION['security']