在開發網站時,我們需要對用戶注冊的郵箱進行核對與驗證,用戶填寫的郵箱是否有效郵箱。
好吧,我們先從數據庫入手,修改用戶表讓用戶有填寫email的字段,添加了2個字段:
1
2
3
4
|
ALTER TABLE [dbo].[Users] ADD [Email] VARCHAR (100) NULL , [IsVerify] BIT NOT NULL DEFAULT (0) SELECT * FROM [dbo].[Users] |
由于你需要做2個功能,一個是要求用戶驗證郵箱有效性,也有可以以郵箱來讓用戶修改用戶密碼。因此需要創建一個表來存儲這2個類型的數據:
1
2
3
4
5
6
7
8
9
|
CREATE TABLE [dbo].[RequestActionType] ( [Type] NVARCHAR(2) NOT NULL PRIMARY KEY , [Description] NVARCHAR(30) NULL ) GO INSERT INTO [dbo].[RequestActionType] ([Type],[Description]) VALUES ( 'V' ,N '驗證郵箱是否有效。' ), ( 'C' ,N '用戶修改密碼' ) |
接下來,你還需要創建另外一張表,是記用戶請求的事件,記錄用戶的一些信息,如帳號,郵箱,鏈接有時效性等:
1
2
3
4
5
6
7
8
9
|
CREATE TABLE [dbo].[UserRequestAction]( [Type] NVARCHAR(2) NOT NULL FOREIGN KEY REFERENCES [dbo].[RequestActionType] ([Type]), [Token] [uniqueidentifier] NOT NULL DEFAULT (NEWID()), [Account] [nvarchar](30) NOT NULL , [Email] [nvarchar](150) NOT NULL , [Expire] [datetime] NOT NULL DEFAULT (DATEADD( day ,(1), CURRENT_TIMESTAMP )), ) GO Source Code |
當用戶更改郵箱成功時,需要同進對[IsVerify] 更改為false。因此你需要對最開始的表寫一個觸發器:
1
2
3
4
5
6
7
8
9
10
11
12
|
CREATE TRIGGER [dbo].[tri_Users_Update] ON [dbo].[Users] FOR UPDATE AS DECLARE @U_nbr NVARCHAR(20),@IsVerify BIT DECLARE @old_email VARCHAR (100),@new_email VARCHAR (100) SELECT @new_email = [Email] FROM INSERTED SELECT @U_nbr = [U_nbr],@old_email = [Email],@IsVerify = [IsVerify] FROM DELETED IF @IsVerify = 1 AND (lEN( ISNULL (@new_email, '' )) = 0 OR @new_email <> @old_email) UPDATE [dbo].[Users] SET [IsVerify] = 0 WHERE [U_nbr] = @U_nbr GO Source Code |
當用戶發出驗證郵箱或是更改密碼時,讓程序執行下面的存儲過程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
CREATE PROCEDURE [dbo].[usp_UserRequestAction_Request] ( @Type NVARCHAR(2), @U_nbr NVARCHAR(20) ) AS IF NOT EXISTS( SELECT TOP 1 1 FROM [dbo].[Users] WHERE [U_nbr] = @U_nbr) BEGIN RAISERROR(N '帳號錯誤或不存存在,請聯系系統管理員。' ,16,1) RETURN END DECLARE @Email NVARCHAR(100) SELECT @Email = [Email] FROM [dbo].[Users] WHERE [U_nbr] = @U_nbr IF EXISTS( SELECT TOP 1 1 FROM [dbo].[UserRequestAction] WHERE [Type] = @Type AND [Account] = @U_nbr AND [Email] = @Email) UPDATE [dbo].[UserRequestAction] SET [Token] = NEWID(),[Expire] = DATEADD( day ,(1), CURRENT_TIMESTAMP ) WHERE [Type] = @Type AND [Account] = @U_nbr AND [Email] = @Email ELSE INSERT INTO [dbo].[UserRequestAction] ([Type],[Account],[Email]) VALUES (@Type,@U_nbr,@Email) GO Source Code |
用戶驗證郵箱有效性,是在登錄之后進行的,因此只需要點擊“驗證”銨鈕即可,系統即發送驗證的郵件至用戶的郵箱中。
另外,當用戶忘記密碼時,是在沒有登錄系統之下進行的,因此需要輸入用戶的帳號才能進行下一步。
均是使用這個存儲過程[dbo].[usp_UserRequestAction_Request]。
接下來的流程是,用戶會打開他的郵箱,查閱剛剛系統發送的郵件。郵件內容就是看實際需求了,如提示用戶,是不是自己本人操作,安全性等,這些都不是怎樣重要,重要的是那一條鏈接。
指示用戶點擊鏈接。這個鏈接會導上到網站一個頁面。當到這個頁面時,系統會在這頁面進行一些程序處理,檢查鏈接有效性,時間是否過期,如果一切沒有問題,會進更新IsVerify字段為ture.
如果是用戶忘記密碼的話,在用戶點擊鏈接,系統也會檢有效性,沒有期,面會出現更改密碼的form,讓用戶進行更改全新的密碼。
Ok,還差2個存儲過程,第一個是更新IsVerify字段值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
CREATE PROCEDURE [dbo].[usp_Users_UpdateIsVerifyField] ( @token NVARCHAR(36) ) AS IF EXISTS( SELECT TOP 1 1 FROM [dbo].[UserRequestAction] WHERE [Token] = @token AND [Expire] >= CURRENT_TIMESTAMP ) BEGIN DECLARE @Account NVARCHAR(30) SELECT @Account = [Account] FROM [dbo].[UserRequestAction] WHERE [Token] = @token UPDATE [dbo].[Users] SET [IsVerify] = 1 WHERE [U_nbr] = @Account UPDATE [dbo].[UserRequestAction] SET [Expire] = DATEADD( DAY ,-1, CURRENT_TIMESTAMP ) WHERE [Token] = @token END GO Source Code |
另一個是ResetPassword的,重設密碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
CREATE PROCEDURE [dbo].[usp_Users_ResetPassword] ( @token NVARCHAR(36), @ Password NVARCHAR(100) ) AS IF EXISTS( SELECT TOP 1 1 FROM [dbo].[UserRequestAction] WHERE [Token] = @token AND [Expire] >= CURRENT_TIMESTAMP ) BEGIN DECLARE @Account NVARCHAR(30) SELECT @Account = [Account] FROM [dbo].[UserRequestAction] WHERE [Token] = @token DECLARE @pwd VARBINARY( MAX ) = ENCRYPTBYPASSPHRASE( 'insus#sec!%y' ,@ Password ) UPDATE [dbo].[Users] SET [Pwd] = @pwd WHERE [U_nbr] = @Account UPDATE [dbo].[UserRequestAction] SET [Expire] = DATEADD( DAY ,-1, CURRENT_TIMESTAMP ) WHERE [Token] = @token END ELSE BEGIN RAISERROR(N '無法更改密碼,請聯系客服或網絡管理員。' ,16,1) RETURN END Source Code |
數據庫方面開發就這樣子,程序方面看你自己發揮了。
以上所述是小編給大家介紹的驗證會員系統中用戶的郵箱是否真實存在的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.cnblogs.com/insus/archive/2016/10/26/5996385.html