ZF in ∞ days –> day 7 –> Zend Framework Auth 登入驗證
網路上做登入驗證已經很多了,所以因此你還有很多文章可以參考,但是 Zendframework 的 AUTH 是 CI (codeigniter) 所沒有的,所以如果要做登入驗證的話是非常快速且是重點學習囉,所以用 ZF 的你千萬不要漏掉喔。
本來想要錄影給大家看,不過在噗浪上問大家,好像大家還是比較喜歡看圖文教學,如果有你找不到的步驟,都歡迎來問問看喔。
Zend Framework 的認證方式並不是只有一種,有分為 DB , HTTP , OpenID 等多種方式,今天我們就以最常用的 DB 驗證來做吧。
STEP 1 :
開啟 phpmyadmin 並且建立 DB = day7 ,插入我們的帳號與密碼
SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE DATABASE 'day7' DEFAULT CHARACTER SET utf8 ; USE 'day7'; CREATE TABLE IF NOT EXISTS 'users' ( 'id' int(11) NOT NULL AUTO_INCREMENT, 'username' varchar(50) COLLATE utf8_unicode_ci NOT NULL, 'password' varchar(50) COLLATE utf8_unicode_ci NOT NULL, 'real_name' varchar(100) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY ('id'), UNIQUE KEY 'username' ('username') ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; INSERT INTO 'users' ('id', 'username','password', 'real_name') VALUES (1, 'rob', 'rob', 'Rob Allen');
STEP 2 :
開啟一個 ZF 專案 ( 不熟悉的朋友請參考 day1 )
並且打開 application.ini 檔案加入 db 的設定資料
application.ini
1 2 3 4 5 6 resources.db.adapter = PDO_MYSQL resources.db.params.host = localhost resources.db.params.username = root resources.db.params.password = 1234 resources.db.params.dbname = day7 resources.db.params.charset = utf8
STEP 3 :
打開 public/index.php 檔案 ,我們要在整個 controller 被載入之前先把 DB 建立起來
index.php
1 2 3 //登記 DB 變數,內容為 ZEND DB ,是參照 application.ini 所建立出來的 $resource = $application->getOption("resources") ; Zend_Registry::set('db', Zend_Db::factory($resource['db']['adapter'],$resource['db']['params']));
STEP 4 :
並且新增一個 ZEND Controller
名稱為 AuthController ,我們要在裡面建立 LoginAction , LogoutAction 以及稍微修改一下 init 的內容
AuthController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 <?php class AuthController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { // action body $this->_redirect ( '/' ); } public function loginAction() { $this->view->message = ''; if ($this->_request->isPost ()) { //先將使用者與密碼過濾 ( 過濾 HTML 與法 ) $f = new Zend_Filter_StripTags (); $username = $f->filter ( $this->_request->getPost ( 'username' ) ); $password = $f->filter ( $this->_request->getPost ( 'password' ) ); //驗證是否有輸入帳號 if (empty ( $username )) { $this->view->message = '請輸入您的帳號'; } else { //如果你想要拿其他的 DB_TABLE 的 DB來源也是可以 //Zend_Loader::loadClass("Users","../application/models/"); //$users = new Users(); //$authAdapter = new Zend_Auth_Adapter_DbTable($users->getAdapter()); $authAdapter = new Zend_Auth_Adapter_DbTable ( Zend_Registry::get ('db')); $authAdapter->setTableName ( 'users' ); $authAdapter->setIdentityColumn ( 'username' ); $authAdapter->setCredentialColumn ( 'password' ); // 設定 ID 與 憑據(就是驗證值啦 俗稱密碼) $authAdapter->setIdentity ( $username ); $authAdapter->setCredential ( $password ); // do the authentication $auth = Zend_Auth::getInstance (); $result = $auth->authenticate ( $authAdapter ); if ($result->isValid ()) { // success: store database row to auth's storage // system. (Not the password though!) $data = $authAdapter->getResultRowObject ( null, 'password' ); $auth->getStorage ()->write ( $data ); $this->_redirect ( '/' ); } else { // failure: clear database row from session $this->view->message = '登入失敗'; } } } $this->view->title = "登入驗證"; } function logoutAction() { Zend_Auth::getInstance()->clearIdentity (); $this->_redirect ( '/' ); } }
STEP 5 :
因為剛剛建立了 LoginAction 因此我們須要在 views/scripts/auth/ 建立一個 login.phtml 的 VIEW
用來建立使用者輸入帳號密碼的表單
注意 : VIEW 的這邊 CODEBOX 會把 箭頭符號吃掉 請記得檢查
login.phtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>登入頁面</title> </head> <body> <h1><?php echo $this->escape($this->title); ?></h1> <?php if(!empty($this->message)) :?> <div id="message"> <?php echo $this->escape($this->message);?> </div> <?php endif; ?> <form action="" method="post"> <div> <label for="username">Username</label> <input type="text" name="username" value=""/> </div> <div> <label for="password">Password</label> <input type="password" name="password" value=""/> </div> <div id="formbutton"> <input type="submit" name="login" value="Login" /> </div> </form> </body> </html>
STEP 6 :
接著我們打開 IndexController.php 頁面,並且修改 init() 以及 新增加一個 predispatch()
init () 內我們主要是希望把登入者的真實名稱顯示出來
predispatch() 主是要在顯示之前先做使用者驗證,如果沒有通過驗證,就轉向 login 頁面
IndexController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?php class IndexController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ //將使用者的真實名稱丟給 view 顯示 $this->view->user = Zend_Auth::getInstance ()->getIdentity (); } public function indexAction() { // action body } function preDispatch() { //再發布之前去判斷是否完成驗證,如果沒有完成驗證就丟到 登入畫面 $auth = Zend_Auth::getInstance (); if (! $auth->hasIdentity ()) { $this->_redirect ( 'auth/login' ); } } }
STEP 7 :
最後我們打開 views/scripts/index/index.php 修改
增加我們險是使用者名稱,以及如果登入完成就讓他出現登出選項
index.php
1 2 3 4 5 <?php if($this->user) : ?> <p id="logged-in">Logged in as <?php echo $this->escape($this->user->real_name);?>. <a href="<?php echo $this->url(array(" controller"=>'auth','action'=>'logout')); ?>">Logout</a></p> <?php endif; ?>
當以上的動作都完成之後我們就可以打開瀏覽器輸入
http://localhost/day7/public/index.php
這時候系統會自動將網頁導向登入頁面要求登入
http://localhost/day7/public/index.php/auth/login
如果我們任意輸入或是輸入 HTML TAG 都會造成無法登入
如果登入成功 系統將會自動轉回首頁,並且出現使用者名稱,並且可以登出
當然,如果按下登出按鈕,使用者資料清除後就回到首頁,但是因為首頁須要登入,又自動轉回登入頁面
如此一來只需要在你想要加密的網頁都加上 predispatch() 就可以讓使用者無法在未登入下存取。
Random Posts
Loading…
相關文章 :









what is CI stand for ?
有些缩寫可以在後面加()補全名嗎?
對初心者而言,這舉動會很貼心的 =..=
@張旭
CI 就是 codeigniter
我相信你知道 不過我還是補給其他朋友 ^_^
已经做完已有教程,全部PASS。
谢谢,期待更多的教程。
@MichaelFei
謝謝你的支持囉 ^_^
目前我也正在接受 Zend 官方的 ZF 教育訓練中
如果有新的收穫在補充一下
目前還有 ACL 的使用方式
但是還沒時間更新 ^_^
有點小複雜@@
@佳佳
照著練習應該是還可以上手沒問題
我的跑到AuthController的
$result = $auth->authenticate ( $authAdapter );
就出現下以 error
An error occurred
Application error
重點是連 exception information, stack trace 都沒有, 不知道怎樣去 debug ><
@mingming
已解決了, mysql driver 沒有弄好
@mingming
有處理好就 ok
不過你的 DEBUG MODE 有打開了嘛?
The next time I learn a weblog, I hope that it doesnt disappoint me as a lot as this one. I imply, I do know it was my option to learn, but I really thought youd have something fascinating to say. All I hear is a bunch of whining about one thing that you possibly can repair if you werent too busy searching for attention.
你的文章超棒~很適合剛接觸ZF的人,希望你可以繼續寫最後出書^^
@newbie
這是先前接觸 ZF 的一些筆記
不過裡面有許多用法其實不是太正確~
出書這件事情對我來說可能有點難因為時間很難掌控 :D
而目前 ZF 維持 1.11 已經好一段時間了應該算是很穩定
看來就等 ZF 2.0 推出以後再看看要不要更新什麼吧
很清楚,詳細及獨一無二的網上教學呀
非常感激你的分享^^
Day1 ~ 7 都完成了
期待會有在ZF寫JQuery的教學啦
謝謝