Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> [ZendFramework] Logowanie użytkownika
in5ane
post
Post #1





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Cześć, chciałbym się dowiedzieć, czy idę w dobrym kierunku tworząc logowanie w Zend Frameworku. Tzn. ogólnie rzecz biorąc, czy to jest dopuszczalne takie logowanie i czy to będzie dobrze działać. Proszę o opinie oraz o dodatkowe pomoce, czy jakieś przykłady waszych logowanie lub szablony.

  1. <?php
  2. function loginAction() {
  3.        $this->view->title = "Twoje konto";
  4.        
  5.        if ($this->_request->isPost()) {
  6.            $filter = new Zend_Filter_StripTags();
  7.            $login = trim($filter->filter($this->_request->getPost('login')));
  8.            $password = md5(trim($filter->filter($this->_request->getPost('password'))));
  9.            
  10.            if ($login != '' && $password != '') {
  11.                $check = new account();
  12.                $select_check = $check->select()->where('login = "'.$login.'" AND password = "'.$password.'"');
  13.                $this->view->patrz = $select_check;
  14.                $row_check = $check->fetchRow($select_check);
  15.                $login = $row_check->login;
  16.                $type = $row_check->type;
  17.                $check = count($row_check);
  18.                if ($check != '') {
  19.                    session_start();
  20.                    if (!isset($_SESSION['zalogowany'])) {
  21.                        ///utworzenie sesji, bla bla bla... do dopisania
  22.                    }
  23.                } else {
  24.                    $this->view->warning = '<font style="color: #ff0000; font-weight: bold;">Wpisane dane są niepoprawne.</font><br /><br />';
  25.                }
  26.            } else {
  27.                $this->view->warning = '<font style="color: #ff0000; font-weight: bold;">Nie wypełniłeś wszystkich pól.</font><br /><br />';
  28.            }
  29.            
  30.        }
  31.  
  32.        $this->view->action = 'login';
  33.        $this->view->buttonText = 'Zaloguj się';
  34.    }
  35. ?>


Ten post edytował in5ane 27.06.2009, 22:52:39
Go to the top of the page
+Quote Post
luki100011
post
Post #2





Grupa: Zarejestrowani
Postów: 243
Pomógł: 20
Dołączył: 20.04.2004
Skąd: Wielkopolska

Ostrzeżenie: (0%)
-----


Raczej nie

Masz komponent Zend_Auth który się tym zajmuje.
Go to the top of the page
+Quote Post
seth-kk
post
Post #3





Grupa: Zarejestrowani
Postów: 444
Pomógł: 79
Dołączył: 26.05.2009

Ostrzeżenie: (0%)
-----


na pierwszy rzut oka ten kod nie jest odpowrny na sql injection
rzuc okiem na przyklady z manuala
Go to the top of the page
+Quote Post
melkorm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


W dodatku zapoznaj się z Zend_Form'em - odpadnie Tobie cała 'ręczna' walidacja i jak już koledzy wspomnieli Zend_Auth.

Kilka uwag:
1. Używasz Zenda, tak ? To dlaczego nie wykorzystujesz jego dobrodziejstw tylko piszesz wszystko na piechte - szczerze na peichte to byś to szybciej napisał bez Zenda (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
2. Zainteresuj się modelami i Zend_Db_Table i pobieranie danych wykonuj w modelu - po to został on stworzony.
3. Używając Zend_Db_Table razem z Zend_Formem odporny jesteś na SqlInjection.

Sądze że to troche pomoże ... bo np. do loginu możesz dorzucić validator (używając Zend_Form'a) i już sam Zend sparwdzi czy login istnieje w bazie dancyh i w razie co wypluje sam błęda (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) (odrazy odsyłam do Zend_Translate - jest to opisane przy Validatorach jak tłumaczyć wiadomości rzucane przez Zenda).

Ten post edytował melkorm 28.06.2009, 13:59:32
Go to the top of the page
+Quote Post
in5ane
post
Post #5





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Trochę nie zrozumiałem tego pierwszego zdania. Jeżeli użyję Zend _Form, to już nie muszę używać Zend_Auth?
Go to the top of the page
+Quote Post
batman
post
Post #6





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Zend_From używasz do stworzenia formularza, a Zend_Auth do logowania użytkownika.
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




zend_form - obsluga formularzy, walidacja, itp.
zend_auth - obsluga autoryzacji

jedno nie ma związku z drugim, ale oba mozesz uzywac jendoczesnie. jesli uzywasz ZendFramework, to jest to nawet wskazane, bys uzywal tych obu klas. Ale nadal kazda z nich sluzy do czego innego (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
nexis
post
Post #8





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

Ostrzeżenie: (0%)
-----


Cytat(in5ane @ 30.06.2009, 11:13:59 ) *
Trochę nie zrozumiałem tego pierwszego zdania. Jeżeli użyję Zend _Form, to już nie muszę używać Zend_Auth?

Zend_Form jak sama nazwa mówi służy do tworzenia formularzy. Do walidacji pól użyj dodatkowo Zend_Validation, który z łatwością integruje się z Zend_Form. A na sam koniec połącz to z Zend_Auth, który przeprowadzi odpowiednie sprawdzenie czy wprowadzone dane zgadzają się z tymi zapisanymi w serwisie.
Go to the top of the page
+Quote Post
in5ane
post
Post #9





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Czy logowanie tego typu dobrze będzie (to dopiero początek):

AccountController.php:
  1. <?php
  2. class AccountController extends Zend_Controller_Action {
  3.  
  4.    function init() {
  5.        $this->view->baseUrl = $this->_request->getBaseUrl();
  6.    }
  7.    
  8.    function getForm() {
  9.        $form = new Zend_Form();
  10.        $form->setAction('/account')->setMethod('post');
  11.  
  12.        $login = $form->createElement('text', 'login', array('label' => 'Login'));
  13.        $login->setRequired(true)
  14.                ->addValidator('NotEmpty', true, array('messages' => array('isEmpty' => 'Nie wpisałeś/aś loginu.')))
  15.                ->addValidator('stringLength', false, array(6, 12, 'messages' => array('stringLengthTooShort' => 'Wpisany login jest za krótki.', 'stringLengthTooLong' => 'Wpisany login jest za długi.')))
  16.                ->addDecorators(array(array('Label', array('class' => 'zf-label')), array('HtmlTag', array('class' => 'zf-description')), array('Errors', array('class' => 'zf-errors'))));
  17.  
  18.        $password = $form->createElement('password', 'password', array('label' => 'Hasło'));
  19.        $password->setRequired(true)
  20.                ->addValidator('NotEmpty', true, array('messages' => array('isEmpty' => 'Nie wpisałeś/aś hasła.')))
  21.                ->addValidator('stringLength', false, array(6, 12, 'messages' => array('stringLengthTooShort' => 'Wpisane hasło jest za krótkie.', 'stringLengthTooLong' => 'Wpisane hasło jest za długie.')))
  22.                ->addDecorators(array(array('Label', array('class' => 'zf-label')), array('Errors', array('class' => 'zf-errors'))));
  23.  
  24.        $form->addElements(array($login, $password))->addElement('submit', 'log', array('label' => 'Zaloguj się'));
  25.        
  26.        return $form;
  27.    }
  28.    
  29.    function indexAction() {
  30.        $this->view->title = "Twoje konto :: Logowanie";
  31.        
  32.        $form = $this->getForm();
  33.        
  34.        if ($this->_request->isPost()) {
  35.            $formData = $this->_request->getPost();
  36.            if ($form->isValid($formData)) {
  37.                $objDbAdapter = new Zend_Db_Adapter_Pdo_Mysql(array('host' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'zend'));
  38.                $objAuthAdapter = new Zend_Auth_Adapter_DbTable($objDbAdapter, 'users', 'login', 'password', 'MD5(?)');
  39.                $objAuthAdapter->setIdentity($this->_getParam('login'))->setCredential($this->_getParam('password'));
  40.                $objAuth = Zend_Auth::getInstance();
  41.                $objResult = $objAuth->authenticate($objAuthAdapter);
  42.                if ($objResult->isValid()) {
  43.                    $data = $objAuthAdapter->getResultRowObject(null, 'password');
  44.                    $objAuth->getStorage()->write($data);
  45.                    $this->_redirect('/account/login');
  46.                } else {
  47.                    $this->view->message = '<p class="zf-errors" style="margin-bottom: 10px;">Logowanie nie powiodło się.</p>';
  48.                }
  49.  
  50.            }
  51.        }
  52.        
  53.        $this->view->form = $form;
  54.    }
  55.  
  56.    function loginAction() {
  57.        $this->view->title = "Twoje konto :: Zalogowany";
  58.        $this->view->user = Zend_Auth::getInstance()->getIdentity();
  59.    }
  60.  
  61.    function logoutAction() {
  62.        Zend_Auth::getInstance()->clearIdentity();
  63.        $this->_redirect('/');
  64.    }
  65. ?>


index.phtml
  1. <?php echo $this->message; ?>
  2. <?php echo $this->form; ?>


login.phtml
  1. <?php if($this->user) : ?>
  2.        Jesteś zalogowany jako: <?php echo $this->user->login; ?>.<br /><br />
  3.        <a href="<?php echo $this->baseUrl ?>/account/logout">Wyloguj się.</a>
  4.    <?php endif; ?>


style.css
Kod
w stylach użyłem zf-label, zf-description oraz zf-errors


Czy to co zacząłem jest dobrze?

@edit: dopisałem zend_auth. W sumie wszystko działa, ale jak to wygląda od kodu, jest to dość poprawnie?

Ten post edytował in5ane 1.07.2009, 11:48:59
Go to the top of the page
+Quote Post
pgrzelka
post
Post #10





Grupa: Zarejestrowani
Postów: 313
Pomógł: 24
Dołączył: 9.08.2008
Skąd: Kielce

Ostrzeżenie: (0%)
-----


czemu tworzysz klasę bazy w kontrolerze ?
nie lepiej w bootstrapie?

potem zapisujesz ją np. w Zend_Registry::set('db', $db);
i w kontrolerze odczytujesz $db = Zend_Registry::get('db');

bazę możesz również odczytać w taki sposób $db = Zend_Db_Table::getDefaultAdapter(); (oczywiście jeśli ustawiłeś wcześniej w boostrapie domyślny adapter bazy)
Go to the top of the page
+Quote Post
in5ane
post
Post #11





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


OK, a tak to poza tym wszystkim dobrze i ładnie napisane?

Chciałbym się też dowiedzieć, jak za pomocą zend_form, mógłbym sobie ułożyć formularz wedle swojego uznania.

Oraz chciałbym się dowiedzieć, jak mogę ustawić, żeby powiedzmy błędy nie pokazywały się pod danym polem, tylko każdy błąd nad formularzem.
Go to the top of the page
+Quote Post
batman
post
Post #12





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Od tego masz dekoratory.
Go to the top of the page
+Quote Post
in5ane
post
Post #13





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Cytat(batman @ 2.07.2009, 13:32:46 ) *
Od tego masz dekoratory.


Trochę średnio rozumiem to, z tej dokumentacji.

Powiedzmy, że ten wygląd zrobię tak (jak jest tam):
  1. <?php
  2. class My_Decorator_Composite extends Zend_Form_Decorator_Abstract
  3. {
  4.     public function buildLabel()
  5.    {
  6. ..........................................................
  7. }
  8. ?>

Aha i gdzie mam umieścić ten plik dokładnie?

Później chcę wykorzystać to do wszystkich pól, no to:
  1. <?php
  2. $form->addElementPrefixPath('My_Decorator', 'My/Decorator/', 'decorator');
  3. ?>


No i nic się nie dzieje, a ustawiłem dla testu, że przed każdym errorem powinno się wyświetlić jakieś "asdasd".

Wie ktoś może jak dobrze używać tych własnych dekoratorów?

Ten post edytował in5ane 5.07.2009, 13:25:13
Go to the top of the page
+Quote Post
batman
post
Post #14





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Cytat(in5ane @ 6.07.2009, 07:16:59 ) *
Wie ktoś może jak dobrze używać tych własnych dekoratorów?
Ja wiem. Ale nie po to podałem Ci linka, byś teraz zawracał 4 litery i podbijał temat. Jeśli coś Ci nie działa, to użyj google, wpisz zend form decorator, poczytaj i dopiero potem zacznij marudzić.
Go to the top of the page
+Quote Post
in5ane
post
Post #15





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Cytat(batman @ 6.07.2009, 06:47:06 ) *
Ja wiem. Ale nie po to podałem Ci linka, byś teraz zawracał 4 litery i podbijał temat. Jeśli coś Ci nie działa, to użyj google, wpisz zend form decorator, poczytaj i dopiero potem zacznij marudzić.


Kolego, no właśnie w tym rzecz, że szukałem i nic nie mogłem znaleźć, a że topic spadał sporo w dół, to go podbijałem, bo możliwe, że ktoś nie zauważył i mi dlatego nie mógł pomóc. Jeszcze spróbuję poszukać, ale jakby co, to proszę o pomoc.
Go to the top of the page
+Quote Post
melkorm
post
Post #16





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


nie umiesz dekoratorów , nie rozumiesz manuala, to zrób inaczej, przeklej do tmpl to co ywpluwa Tobie Zend_Form dorzuć reportowanie błędów przez:
  1. <?php
  2. $form->getElement('nazwa_pola')->getMessages(); //zwraca tablicę
  3. ?>


Wystarczy że ozstawisz dobre nazy pól inputów / forma i Zend_Form będzie działał tak smao jakbyś zrobił:

  1. <?php
  2. echo $this->form;
  3. ?>

I teraz możesz sobie to normalnie stylwoac bez przeszkód.

Szczerze nie odpowiadałem na ten wątek bo nie miałem czasu i troche chęci, troche ciężko co chwila komuś tłumaczyć manuala (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)

Ten post edytował melkorm 6.07.2009, 10:46:28
Go to the top of the page
+Quote Post
in5ane
post
Post #17





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


@up: właśnie mnie chodzi o to, aby ogarnąć te dekoratory. Ale z tego manuala, źle je zrozumiałem ;/
Go to the top of the page
+Quote Post
melkorm
post
Post #18





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Ja sam nie używam dekoratorów (jeszcze nie zdażyło mi się użyc (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) ), po stronie admina używam Zend_Form (przerobiłem go na własne potrzeby) normalnie, ale po stronie frontendu wpisuje ręcznie - o wiele łatwiej wtedy to ostylować.

A jak nie rozumiesz dekoratorów (imho jest krok po kroku napsiane co i jak) no to nie oczekuj od Nas że będziemy Tobie wszystko tłumaczyć (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Jeżeli nie ogarniasz Zenda to daj sobie spokój i weź się za jakiś prostrzy framework bo Zend jest ciężki (może to troche za dużo powiedziane ...) ;]

Ten post edytował melkorm 6.07.2009, 10:56:48
Go to the top of the page
+Quote Post
batman
post
Post #19





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Cytat(in5ane @ 6.07.2009, 11:38:48 ) *
no właśnie w tym rzecz, że szukałem i nic nie mogłem znaleźć
Pierwszy wynik - http://devzone.zend.com/article/3450
trzeci wynik - http://bethgranter.wordpress.com/2008/04/2...tom-decorators/

Coś kiepsko szukałeś. Wszystko jest jasno i dokładnie opisane. Jedyne co trzeba zrobić to poszukać.
Go to the top of the page
+Quote Post
in5ane
post
Post #20





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Dzięki. A mam pytanie, czy to logowanie, które napisałem jest już poprawne i zabezpieczone:
  1. <?php
  2. function getForm() {
  3.        $form = new Zend_Form();
  4.        $form->setAction('/account')->setMethod('post');        
  5.  
  6.        $login = $form->createElement('text', 'login', array('label' => 'Login'));
  7.        $login->setRequired(true)
  8.                ->addValidator('NotEmpty', true, array('messages' => array('isEmpty' => 'Nie wpisałeś/aś loginu.')))
  9.                ->addValidator('stringLength', false, array(6, 12, 'messages' => array('stringLengthTooShort' => 'Wpisany login jest za krótki.', 'stringLengthTooLong' => 'Wpisany login jest za długi.')))
  10.                ->addDecorators(array(array('Label', array('class' => 'zf-label')), array('HtmlTag', array('class' => 'zf-htmltag')), array('Errors', array('class' => 'zf-errors'))));
  11.  
  12.        $password = $form->createElement('password', 'password', array('label' => 'Hasło'));
  13.        $password->setRequired(true)
  14.                ->addValidator('NotEmpty', true, array('messages' => array('isEmpty' => 'Nie wpisałeś/aś hasła.')))
  15.                ->addValidator('stringLength', false, array(6, 20, 'messages' => array('stringLengthTooShort' => 'Wpisane hasło jest za krótkie.', 'stringLengthTooLong' => 'Wpisane hasło jest za długie.')))
  16.                ->addDecorators(array(array('Label', array('class' => 'zf-label')), array('HtmlTag', array('class' => 'zf-htmltag')), array('Errors', array('class' => 'zf-errors'))));
  17.  
  18.        $submit = $form->createElement('submit', 'log', array('label' => 'Zaloguj się'));
  19.        $submit->addDecorators(array(array('HtmlTag', array('class' => 'zf-htmltag-submit'))));
  20.  
  21.        $form->addElements(array($login, $password, $submit));
  22.        
  23.        return $form;
  24.    }
  25.    
  26.    function indexAction() {
  27.        $this->view->title = "Twoje konto :: Logowanie";
  28.        
  29.        $form = $this->getForm();
  30.        
  31.        if ($this->_request->isPost()) {
  32.            $formData = $this->_request->getPost();
  33.            if ($form->isValid($formData)) {
  34.                $objDbAdapter = new Zend_Db_Adapter_Pdo_Mysql(array('host' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'zend'));
  35.                $objAuthAdapter = new Zend_Auth_Adapter_DbTable($objDbAdapter, 'users', 'login', 'password', 'MD5(?)');
  36.                $objAuthAdapter->setIdentity($this->_getParam('login'))->setCredential($this->_getParam('password'));
  37.                $objAuth = Zend_Auth::getInstance();
  38.                $objResult = $objAuth->authenticate($objAuthAdapter);
  39.                if ($objResult->isValid()) {
  40.                    $data = $objAuthAdapter->getResultRowObject(null, 'password');
  41.                    $objAuth->getStorage()->write($data);
  42.                    $this->_redirect('/account/');
  43.                } else {
  44.                    $this->view->message = '<p class="zf-errors" style="margin-bottom: 10px;">Logowanie nie powiodło się.</p>';
  45.                }
  46.            }
  47.        }
  48.        
  49.        $this->view->form = $form;
  50.        $this->view->user = Zend_Auth::getInstance()->getIdentity();
  51.    }
  52. ?>


Aha i jeszcze jedno pytanko, bo z tego co wiem, to dzięki temu zend_auth można wypisać różnego rodzaju błędy. W jaki sposób się to tworzy? No bo ja mam tylko else, w którym jest napis, że logowanie nie powiodło się.
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 16:49