Hallo Leute ich habe ein Problem das die Autorisation ignoriert wird
Wenn ich es richtig verstanden habe muss ich doch die Resource(GuestbookController) mit einem Interface ausstatten und auch den User..
Das habe ich auch getan..
Ich vermute mal, das er im Plugin die Ressource nicht richtig erkennt und dadurch immer null setzt, was heisst jede Userart erlaubt ..
Ich habe keine Module definiert, sollte also im Modul 'default' sein..
Das Plugin habe ich aus einem Tutorial und kann jetzt so ziemlich alles Nachvollziehen..
Allerdings weiss ich nicht, was ich verkehrt mache???
Hat jemand eine Idee???
Ich habe einen GuestbookController mit dem Interface Zend_Acl_Resource_Interface
PHP-Code:
class GuestbookController extends Zend_Controller_Action implements Zend_Acl_Resource_Interface
{
public function getResourceId()
{
return 'user_area';
}
public function init()
{
/* Initialize action controller here */
}
public function indexAction()
{
}
}
und ein Model User mit dem Interface Zend_Acl_Role_Interface
PHP-Code:
class Application_Model_User implements Zend_Acl_Role_Interface
{
private $_id;
private $_username;
private $_pass;
private $_email;
private $_lastlogin;
private $_firstlogin;
private $_role;
protected $_aclRoleId = null;
public function __construct(array $options = null)
{
if (is_array($options)) {
$this->setOptions($options);
}
}
public function getRoleId()
{
if ($this->_role == null) {
return 'guest';
}else{
return $this->getRole();
}
}
public function __set($name, $value)
{
$method = 'set' . $name;
if (('mapper' == $name) || !method_exists($this, $method)) {
throw new Exception('Ungültige User Eigenschaft');
}
$this->$method($value);
}
public function getId()
{
return $this->_id;
}
public function setId($id)
{
$this->_id = $id;
}
public function getUsername()
{
return $this->_username;
}
public function setUsername($username)
{
$this->_username = $username;
}
public function getPass()
{
return $this->_pass;
}
public function setPass($pass)
{
$this->_pass = $pass;
}
public function getEmail()
{
return $this->_email;
}
public function setEmail($email)
{
$this->_email = $email;
}
public function getLastlogin()
{
return $this->_lastlogin;
}
public function setLastlogin($lastlogin)
{
$this->_lastlogin = $lastlogin;
}
public function getFirstlogin()
{
return $this->_firstlogin;
}
public function setFirstlogin($firstlogin)
{
$this->_firstlogin = $firstlogin;
}
public function getRole()
{
return $this->_role;
}
public function setRole($role)
{
$this->_role = $role;
}
}
Das ganze wird über ein Plugin geprüft
PHP-Code:
class Plugin_Auth_AccessControl extends Zend_Controller_Plugin_Abstract
{
public function __construct(Zend_Auth $auth, Zend_Acl $acl)
{
$this->_auth = $auth;
$this->_acl = $acl;
}
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$message = "Posts: User: ".$this->getRequest()->getParam('username');
if (!$this->_auth->hasIdentity() && null !== $request->getPost('username') &&
null !== $request->getPost('pass')) {
echo "Daten sind gesendet!!";
// POST-Daten bereinigen
$filter = new Zend_Filter_StripTags();
$username = $filter->filter($request->getPost('username'));
$password = $filter->filter($request->getPost('pass'));
if (empty($username)) {
$message = 'Bitte Benutzernamen angeben.';
}
elseif (empty($password)) {
$message = 'Bitte Passwort angeben.';
}
else
{
$authAdapter = new Plugin_Auth_AuthAdapter();
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);
$result = $this->_auth->authenticate($authAdapter);
if (!$result->isValid()) {
$messages = $result->getMessages();
$message = $messages[0];
} else {
$storage = $this->_auth->getStorage();
// die gesamte Tabellenzeile in der Session speichern,
// wobei das Passwort unterdrückt wird
$storage->write($authAdapter->getResultRowObject(null, 'pass'));
}
//$registry = Zend_Registry::getInstance();
//$view = $registry->view;
}
if (isset($message)) {
$view->message = $message;
}
}
}
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
if ($this->_auth->hasIdentity() &&is_object($this->_auth->getIdentity())) {
var_dump($this->_auth->getIdentity());
$role = $this->_auth->getIdentity()->role;
echo "...Treffer: ".$role;
} else {
$role = 'guest';
echo "...kein Treffer: ".$role."... ";
}
$module = $request->getModuleName(); // Hier vermute ich geht der Fehler los
var_dump($module);
// Ressource == Modul -> kann hier geändert werden!
// Wie kann ich denn die Resource abfragen und nicht das modul??
$resource = $module;
if (!$this->_acl->has($resource)) {
echo "keine Gesperrte Resource... ";
$resource = null;
}
echo "Role: ".$role." + Resource: ".$resource;
if (!$this->_acl->isAllowed($role, $resource)) {
if ($this->_auth->hasIdentity()) {
echo "Wieder ein Treffer";
// angemeldet, aber keine Rechte -> Fehler!
$request->setModuleName('default');
$request->setControllerName('error');
$request->setActionName('noAccess');
} else {
echo "Wieder kein Treffer";
//nicht angemeldet -> Login
$request->setModuleName('default');
$request->setControllerName('user');
$request->setActionName('login');
}
}
}
}
Welcher seine Werte aus hieraus nimmt..
PHP-Code:
class Plugin_Auth_Acl extends Zend_Acl
{
public function __construct()
{
// RESSOURCES
$this->add(new Zend_Acl_Resource('admin'));
$this->add(new Zend_Acl_Resource('user_area'));
$this->addRole(new Zend_Acl_Role('guest'));
$this->addRole(new Zend_Acl_Role('user'), 'guest');
$this->addRole(new Zend_Acl_Role('admin'), 'user');
$this->allow(null, null);
$this->deny('guest', 'user_area');
$this->deny('guest', 'admin');
$this->allow('user','user_area');
$this->allow('admin', 'admin');
}
}