Play框架的用戶驗證。

最近剛剛參與一個基于Play框架的管理平臺的升級工作,其中涉及到了用戶的驗證工作。第一次接觸play框架,直接看已有代碼,有點暈。因此,自己實現了一個簡單的用戶驗證功能。

首先,新建一個User類,包含兩個屬性,包含兩個屬性email和password。并在構造器中對密碼進行了加密。

@Entity
public class User extends Model {
@Id
private String email;
private String password;

// Constructor
public User(String email, String password) {
String passwordHash = BCrypt.hashpw(password, BCrypt.gensalt());
this.email = email;
this.password = passwordHash;
}
}

接下來,新增控制器Application.java,其中主要包含包含兩個動作和一個表單類Registration。一個動作register()用于顯示注冊頁面,另一個動作postRegister處理表單提交的信息,
并增加相應的數據庫記錄。Registration則對應注冊頁面所顯示的表格:
public class Application extends Controller {public static class Registration {@Emailpublic String email;@Requiredpublic String password;}public static Result register() {Form<Registration> userForm = Form.form(Registration.class);return ok(views.html.register.render(userForm));}public static Result postRegister() {Form<Registration> userForm = Form.form(Registration.class).bindFromRequest();User user = new User(userForm.get().email, userForm.get().password);user.save(); return ok("registered"); }
}

其后,新增Rigister所對應的前端頁面,并在Routes文件中為Appication所對應的動作增加訪問路徑。
<!DOCTYPE html>
<html><body><h1> Registration </h1>@helper.form(action = routes.Application.postRegister()) {@helper.inputText(userForm("email"))@helper.inputPassword(userForm("password"))<input type="submit">}</body>
</html>

Routes文件:
GET     /register                   controllers.Application.register()
POST    /register                   controllers.Application.postRegister()

其后,訪問頁面,輸入用戶名和密碼,可以看到數據庫中新增了一條記錄。
接下來,將用戶驗證的邏輯加入到User類中,修改User類,新增authenticate()方法。authenticate()接收的是明文密碼。上面的驗證中,首先檢查用戶郵箱是否存在。如果存在,則檢查密碼是否符合數據庫的記錄。
如果郵箱或者密碼錯誤,將返回null。否則返回正確的用戶對象。
// Querypublic static Model.Finder<Integer, User> find = new Model.Finder<>(Integer.class, User.class);// Authentificationpublic static User authenticate(String email, String password) {User user =  find.where().eq("email", email).findUnique();if (user == null) {return user;} else if (BCrypt.checkpw(password, user.password)) {return user;} else {return null;}}
接下來,進一步修改Application控制器,增加兩個動作和一個表單類。動作login()用于顯示登錄頁面,動作postLogin()用于處理登錄表單填寫的信息,并根據信息決定是否登入用戶。Login類對應登錄頁面的表單。
 public static class Login {@Emailpublic String email;@Requiredpublic String password;public String validate() {if (User.authenticate(email, password) == null) {return "Invalid user or password";} return null;}}public static Result login() {Form<Login> userForm = Form.form(Login.class);return ok(views.html.login.render(userForm));}public static Result postLogin() {Form<Login> userForm = Form.form(Login.class).bindFromRequest();if (userForm.hasErrors()) {return badRequest("Wrong user/password");} else {return ok("Valid user");}}
其中,在靜態類Login中,增加了validate()方法,并在其中調用User的驗證邏輯。正如postLogin()中所示,表單的hasErrors()方法將自動檢查validate()方法的返回值。如果validate()方法返回為null,
則說明表單無誤。postLogin()的if結構,將根據登錄是否合法,來返回不同的結果。

最后,同樣的在Routes文件中新增兩條對應的URL
GET     /login                      controllers.Application.login()
POST    /login                      controllers.Application.postLogin()

其后,訪問/login頁面,并嘗試登錄。發現已增加了驗證功能。





轉載于:https://www.cnblogs.com/junjiang3/p/7027893.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254344.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254344.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#條件運算符if-else的簡化格式

文章目錄博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 條件運算符&#xff08;&#xff1f;&#xff1a;&#xff09;是&#xff49;&#xff46;……&#xff45;&#xff4c;&#xff53;&#xff45;的簡化形式 其使用格式為&#xff1a…

碼率控制方式選擇

同碼率下的圖像質量或同圖像質量下的碼率。 AVCodecContext /** * the average bitrate * - encoding: Set by user; unused for constant quantizer encoding. * - decoding: Set by libavcodec. 0 or some bitrate if this info is available in the strea…

Fortran執行語句中的“雙冒號” ::

雙冒號“::”&#xff0c;通常出現于Fortran在變量聲明中&#xff0c;但是在特殊情況下&#xff0c;也會出現于數組中。例如&#xff1a; ... real,target,dimension(10):: a real,pointer,dimension(:):: pa,pb integer:: n3 ... pa > a(n::1) pb > a(n:10:1) ... 咋一看…

VS配置本地IIS以域名訪問

1.IIS下配置自己的網站&#xff0c;添加主機名 2.修改hosts文件&#xff08;C://Windows/System32/drivers/etc&#xff09; 3.VS中配置項目Web服務器&#xff08;選擇外部主機&#xff09; 轉載于:https://www.cnblogs.com/zuimeideshi520/p/7028544.html

try、catch、finally 和 throw-C#異常處理

文章目錄博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 異常是在程序執行期間出現的問題。C# 中的異常是對程序運行時出現的特殊情況的一種響應&#xff0c;比如嘗試除以零。 異常提供了一種把程序控制權從某個部分轉移到另一個部分的方式。…

Spark RDD/Core 編程 API入門系列 之rdd實戰(rdd基本操作實戰及transformation和action流程圖)(源碼)(三)...

本博文的主要內容是&#xff1a; 1、rdd基本操作實戰 2、transformation和action流程圖 3、典型的transformation和action RDD有3種操作&#xff1a; 1、 Trandformation 對數據狀態的轉換&#xff0c;即所謂算子的轉換 2、 Action 觸發作業&#xff0c;即所謂得結果…

用GDB調試程序

GDB概述GDB 是GNU開源組織發布的一個強大的UNIX下的程序調試工具。或許&#xff0c;各位比較喜歡那種圖形界面方式的&#xff0c;像VC、BCB等IDE的調試&#xff0c;但如果你是在 UNIX平臺下做軟件&#xff0c;你會發現GDB這個調試工具有比VC、BCB的圖形化調試器更強大的功能。所…

燈塔的出現給那些有想法,有能力而又缺乏資金的社區人士提供了一條途徑

2019獨角獸企業重金招聘Python工程師標準>>> 在上個月&#xff0c;BCH社區傳出基于比特幣現金的眾籌平臺Lighthouse&#xff08;燈塔&#xff09;正在復活的消息&#xff0c;并且有網友在論壇上貼出了部分網站圖片。當消息被證實為真&#xff0c;官網和項目的審核細…

PID 算法理解

PID 算法 使用環境&#xff1a;受到外界的影響不能按照理想狀態發展。如小車的速度不穩定的調節&#xff0c;盡快達到目標速度。 條件&#xff1a;閉環系統->有反饋 要求&#xff1a;快準狠 分類&#xff1a;位置式、增量式 增量式 輸入&#xff1a;前次速度、前前次速度、前…

C#字符串的基本操作

文章目錄簡介字符串判斷是否相等語法實例字符串比較大小語法實例判斷字符串變量是否包含指定字符或字符串語法實例查找字符串變量中指定字符或字符串出現的位置語法實例取子串語法實例插入子串語法實例刪除子串語法實例替換子串語法實例去除字符串空格語法實例博主寫作不容易&a…

C++利用SOCKET傳送文件

C利用SOCKET傳送文件 /*server.h*/ #pragma comment(lib, "WS2_32") #include <WinSock2.h> #include <iostream> //#include <stdio.h> #include <assert.h> #ifndef COMMONDEF_H #define COMMONDEF_H #define MAX_PACKET_SIZE 10240 …

三種方式在CentOS 7搭建KVM虛擬化平臺

KVM 全稱是基于內核的虛擬機&#xff08;Kernel-based Virtual Machine&#xff09;&#xff0c;它是一個 Linux的一個內核模塊&#xff0c;該內核模塊使得 Linux變成了一個Hypervisor&#xff1a;它由 Quramnet開發&#xff0c;該公司于 2008年被 Red Hat 收購 KVM的整體結構&…

(五)EasyUI使用——datagrid數據表格

DataGrid以表格形式展示數據&#xff0c;并提供了豐富的選擇、排序、分組和編輯數據的功能支持。DataGrid的設計用于縮短開發時間&#xff0c;并且使開發人員不需要具備特定的知識。它是輕量級的且功能豐富。單元格合并、多列標題、凍結列和頁腳只是其中的一小部分功能。具體功…

拾取模型的原理及其在THREE.JS中的代碼實現

1. Three.js中的拾取 1.1. 從模型轉到屏幕上的過程說開 由于圖形顯示的基本單位是三角形&#xff0c;那就先從一個三角形從世界坐標轉到屏幕坐標說起&#xff0c;例如三角形abc 乘以模型視圖矩陣就進入了視點坐標系&#xff0c;其實就是相機所在的坐標系&#xff0c;如下圖&am…

StringBuilder-C#字符串對象

博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 在C# 中&#xff0c;string是引用類型&#xff0c;每次改變string類對象的值&#xff0c;即修改字符串變量對應的字符串&#xff0c;都需要在內存中為新的字符串重新分配空間。在默寫特定的情況…

java 19 - 11 異常的注意事項

1 /*2 * 異常注意事項:3 * A:子類重寫父類方法時&#xff0c;子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)4 * B:如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常5 * C:如果被重寫的…

數組去重的各種方式對比

數組去重&#xff0c;是一個老生常談的問題了&#xff0c;在各廠的面試中也會有所提及&#xff0c;接下來就來細數一下各種數組去重的方式吧&#xff1b; 對于以下各種方式都統一命名為 unique&#xff0c;公用代碼如下&#xff1a; // 生成一個包含100000個[0,50000)隨機數的數…

Linux平臺Makefile文件的編寫基礎篇和GCC參數詳解

問&#xff1a;gcc中的-I.是什么意思。。。。看到了有的是gcc -I. -I/usr/xxxxx..那個-I.是什么意思呢 最佳答案 答&#xff1a;-Ixxx 的意思是除了默認的頭文件搜索路徑(比如/usr/include等&#xff09;外&#xff0c;同時還在路徑xxx下搜索需要被引用的頭文件。 所以你的gcc …

舊知識打造新技術--AJAX學習總結

AJAX是將舊知識在新思想的容器內進行碰撞產生的新技術&#xff1a;推翻傳統網頁的設計技術。改善用戶體驗的技術。 學習AJAX之初寫過一篇《與Ajax的初次謀面》。當中都僅僅是一些自己淺顯的理解&#xff0c;這次就總結一下它在歷史長河中的重要地位。 【全】 AJAX全稱為Asnychr…