首頁 > ZEND framework, 網頁設計 > ZF in ∞ days –> day 7 –> Zend Framework Auth 登入驗證

ZF in ∞ days –> day 7 –> Zend Framework Auth 登入驗證

2010年6月5日  瀏覽次數 : 15,227

網路上做登入驗證已經很多了,所以因此你還有很多文章可以參考,但是 Zendframework 的 AUTH 是 CI (codeigniter) 所沒有的,所以如果要做登入驗證的話是非常快速且是重點學習囉,所以用 ZF 的你千萬不要漏掉喔。

0605-01

本來想要錄影給大家看,不過在噗浪上問大家,好像大家還是比較喜歡看圖文教學,如果有你找不到的步驟,都歡迎來問問看喔。

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');

image 

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

image

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']));

image

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 ( '/' );
	}
 
}

image

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>

image

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' );
		}
	}
 
}

image

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="&lt;?php echo $this-&gt;url(array(" controller"=>'auth','action'=>'logout')); ?>">Logout</a></p>
<?php endif; ?>

image

當以上的動作都完成之後我們就可以打開瀏覽器輸入

http://localhost/day7/public/index.php

這時候系統會自動將網頁導向登入頁面要求登入

http://localhost/day7/public/index.php/auth/login

image

如果我們任意輸入或是輸入 HTML TAG 都會造成無法登入

image

image

image

如果登入成功 系統將會自動轉回首頁,並且出現使用者名稱,並且可以登出

image

當然,如果按下登出按鈕,使用者資料清除後就回到首頁,但是因為首頁須要登入,又自動轉回登入頁面

image

 

如此一來只需要在你想要加密的網頁都加上 predispatch() 就可以讓使用者無法在未登入下存取。

Random Posts

Loading…

:: 把這篇好文推到書籤網站與更多人分享吧 ::
  • funp
  • Hemidemi
  • YahooKimo
  • Google
  • udn
  • Haohao
  • Live

相關文章 :

Ausir ZEND framework, 網頁設計 , , , , , ,

  1. 張旭
    2010年6月5日22:24 | #1

    what is CI stand for ?

    有些缩寫可以在後面加()補全名嗎?
    對初心者而言,這舉動會很貼心的 =..=

  2. 2010年6月5日22:26 | #2

    @張旭

    CI 就是 codeigniter
    我相信你知道 不過我還是補給其他朋友 ^_^

  3. MichaelFei
    2010年6月22日00:43 | #3

    已经做完已有教程,全部PASS。
    谢谢,期待更多的教程。

  4. 2010年6月22日01:39 | #4

    @MichaelFei

    謝謝你的支持囉 ^_^
    目前我也正在接受 Zend 官方的 ZF 教育訓練中
    如果有新的收穫在補充一下

    目前還有 ACL 的使用方式
    但是還沒時間更新 ^_^

  5. 2010年8月14日09:05 | #5

    有點小複雜@@

  6. 2010年8月15日21:02 | #6

    @佳佳

    照著練習應該是還可以上手沒問題

  7. mingming
    2011年1月28日16:22 | #7

    我的跑到AuthController的
    $result = $auth->authenticate ( $authAdapter );
    就出現下以 error

    An error occurred
    Application error

    重點是連 exception information, stack trace 都沒有, 不知道怎樣去 debug ><

  8. mingming
    2011年1月29日19:10 | #8

    @mingming
    已解決了, mysql driver 沒有弄好

  9. 2011年1月29日23:58 | #9

    @mingming

    有處理好就 ok
    不過你的 DEBUG MODE 有打開了嘛?

  10. 2011年3月1日20:25 | #10

    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.

  11. newbie
    2012年2月11日06:18 | #11

    你的文章超棒~很適合剛接觸ZF的人,希望你可以繼續寫最後出書^^

  12. 2012年2月11日17:45 | #12

    @newbie

    這是先前接觸 ZF 的一些筆記
    不過裡面有許多用法其實不是太正確~
    出書這件事情對我來說可能有點難因為時間很難掌控 :D
    而目前 ZF 維持 1.11 已經好一段時間了應該算是很穩定
    看來就等 ZF 2.0 推出以後再看看要不要更新什麼吧

  13. Dicky囝囝
    2012年3月2日15:52 | #13

    很清楚,詳細及獨一無二的網上教學呀
    非常感激你的分享^^
    Day1 ~ 7 都完成了
    期待會有在ZF寫JQuery的教學啦
    謝謝

  1. 本篇文章目前尚無任何 trackbacks 和 pingbacks。