1

Temat: autoryzacja w wszystkich kontrolerach, app_controller.php

Witam,
robię właśnie pewien studencki projekt w cakePHP i jest to moje pierwsze spotkanie z tym frameworkiem, dlatego proszę o wyrozumiałość jeśli pytanie jest zbyt banalne (choć sądząc z ilości narzekań jakie zwraca google po wpisaniu czegoś w stylu "cakePHP, Auth, ACL" nie koniecznie takie banalne).
Korzystam z cakePHP 1.3.0 i mam problem z autoryzacją przy użyciu komponentu Auth (Auth, nie ACL bo ACL chyba jest na tym etapie dla mnie za trudne, a to tylko studencki projekt). Autoryzacja ma dotyczyć wszystkich kontrolerów dlatego w folderze "app" kejka dodałam plik app_controller.php dodając wewnątrz klasy następujące akcje:

var $components = array('Auth');

function beforeFilter () {
    Security::setHash("md5");
    $this->Auth->userModel='Resident';
    $this->Auth->loginAction = array('controller'=>'Resident', 'action'=>'login');
    $this->Auth->allow('*');
    $this->Auth->loginRedirect=array('controller'=>'Resident', 'action'=>'login');
    $this->Auth->logoutRedirect=array('controller'=>'Resident', 'action'=>'login');
    $this->Auth->loginError = 'Błąd logowania';
    //$this->Auth->authorize='controller';
    parent::beforeFilter();
}

function login() {}

function logout () {
    $this->Session->setFlash('Wylogowany');
    $this->redirect($this->Auth->logout());
}

function isAuthorized() {
    if ($this->Auth->user('typ')!='admin') {
        $this->Auth->deny('add', 'edit', 'delete');
    }
}

W mojej bazie danych nie ma tabeli users, podobne funkcje pełni tabela residents, z tąd "$this->Auth->userModel='Resident'". Do haszowania chcę użyć funkcji MD5 ponieważ moja aplikacja ma współpracować z wykonanym przez kolegę, w czystym PHP, forum korzystającym z tej samej tabeli residents (wspólny projekt, dwa dość niezależne moduły). Pozatym nie chcę żeby cake do zapisu haseł używał jakiegoś salt, bo będą problemy z współpracą z wspomnianym forum. Na tym etapie nie precyzuję jeszcze jaki użytkownik ma mieć dostęp do których akcji ("$this->Auth->allow('*')"), bo na razie mam większy problem. Mimo użycia "$this->Auth->userModel='Resident'" otrzymuję komunikaty: "Error: UsersController could not be found.", nie rozumiem dlaczego i co muszę poprawić. Autoryzacja i podział na część dostępną dla użytkowników z tabeli residents, których typ=admin i tych z typ=mieszkaniec to ostatnia rzecz jaka została mi do dokończenia w tym projekcie dlatego naprawdę nie chcę zmieniać nazwy tabeli (kolega musiałby też w takim przypadku poprawiać forum, nieciekawa sytuacja sad). Nie mam jeszcze zbyt wiele doświadczenia z cakePHP, a szczerze mówiąc tak na prawdę dopiero uczę się programować wogóle więc może po prostu robię gdzieś jakiś prosty błąd.

W kontrolerze residents_controller.php mam jeszcze takie akcje związane z autoryzacją:

function beforeFilter() {
    if ($this->data['Resident']['password']) {
        $this->data['Resident']['password'] = md5($this->data['Resident']['password']);
    }
    return true;
}

function userloged() {
    $userData = $this->Auth->user();
    $this->set('userData', $userData);
}

function login() {}

function logout () {
    $this->Session->setFlash('Wylogowany');
    $this->redirect($this->Auth->logout());
}

Właściwie nie wiem gdzie umieścić akcje login i logout, w app_controller.php czy residents_controller.php? Nie wiem też gdzie umieścić widok dla logowania, na razie wrzuciłam go do widoków dla residents_controller.php. Widok dla logowania wygląda tak:

<div class="login"> 
<h2>Login</h2>     
    <?php echo $form->create('User', array('action' => 'login'));?> 
        <?php echo $form->input('username');?> 
        <?php echo $form->input('password');?> 
        <?php echo $form->submit('Login');?> 
    <?php echo $form->end(); ?> 
</div>

To moja pierwsza próba zrobienia jakiejkolwiek autoryzacji w cakePHP i nie dziwiłyby mnie błędy składniowe itp. ale komunikat o brakującym kontrolerze?...

Proszę o jakieś wskazówki, jak rozwiązać mój problem. Czekam niecierpliwie wink

2 (edytowany przez id02009 2010-11-02 11:23:49)

Odp: autoryzacja w wszystkich kontrolerach, app_controller.php

Wielu ludzi zakłada, że we frameworkach jest więcej magii niż jest faktycznie. Staraj się nie zapominać o podstawach OOP i praca z cakePHP będzie łatwiejsza.

w ResidentsController nadpisujesz beforeFilter i tracisz konfigurację z AppController (Auth działa na podstawie domyślnych ustawień i stąd error z nieistniejącym kontrolerem UsersController):

ResidentsController extends AppController{
function beforeFilter(){
  parent::beforeFilter();
  //...
}

Poza tym wywal login/logout z AppController - nie są to akcje, które mają być dostępne w każdym kontrolerze, który dziedziczy po AppController. One powinny siedzieć w ResidentsController. Analogicznie widoki: /app/views/residents/login.ctp

Mam nadzieję, ze pomogło wink

3

Odp: autoryzacja w wszystkich kontrolerach, app_controller.php

Pomogło!
id02009, dzięki!