歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 【play2.0教程】實現用戶登錄安全控制

【play2.0教程】實現用戶登錄安全控制

日期:2017/3/1 10:10:23   编辑:Linux編程

使用play2有一段時間,打算寫點使用心得,希望能提高自己的同時也能幫助一些人。

先從用戶安全著手吧。每個網站都會用到用戶注冊,會員分級等功能

1、play2自身的已經提供的API,不過比較簡單,先看下API

object Security extends AnyRef

def Authenticated [A] (action: (String) ⇒ Action[A]): Action[(Action[A], A)]

def Authenticated [A] (username: (RequestHeader) ⇒ Option[String], onUnauthorized: (RequestHeader) ⇒ Result)(action: (String) ⇒ Action[A]): Action[(Action[A], A)]

lazy val username : String

API已經提供的基本的功能 我們看Authenticated方法參數, 第一個參數是一個獲取用戶名的函數,第二個參數是未登錄調用的函數,第三個參數是已登錄時調用的函數。如果每次寫都很麻煩,要傳3個參數,大部分情況下未登錄都是返回到登錄或首頁,OK,那麼我們可以在其功能上封裝一下

2、封裝為trait,這樣可以方便我們的控制器使用。

trait Secured {

//第一個參數
private def username(request: RequestHeader): Option[String] = request.session.get("username")

//獲取用戶的詳細信息
def user(request: RequestHeader): Option[models.User] = {
val user = request.session.get("username")
user match {
case Some(u) => Some(User.findByUsername(u))
case _ => None
}
}

//默認沒有登錄的情況下返回登錄頁面
def onUnauthorized(request: RequestHeader) = {
Results.Redirect(routes.UserApplication.login)
}

//當用戶需要自定義驗證失敗是調用
def IsAuthenticated(unAuthorized: RequestHeader => Result)(f: User => Request[AnyContent] => Result) = {
authenticated(unAuthorized, f)
}
//默認驗證失敗是調用
def IsAuthenticated(f: User => Request[AnyContent] => Result) = {
authenticated(onUnauthorized, f)
}

def authenticated( unAuthorized: RequestHeader => Result, f: User => Request[AnyContent] => Result) = {
Security.Authenticated(username, unAuthorized){
username => {
var user = User.findByUsername(username)
Action(request => f(user)(request))
}
}
}
}

上面的已經基本滿足我們需求,調用簡單,未登錄的情況下返回登錄頁面,如果特殊的需求我們也可以自定義操作。

3、使用封裝好的trait

object UserApplication extends Controller with Secured {

//正常使用
def fans = IsAuthenticated{ user => request =>
val rs = Topic.getMyPagination(user.id, 1, 20)
Ok(views.html.user.fans(Some(user)))
}
//使用自定義的驗證失敗
def fansCur = IsAuthenticated((request: RequestHeader) => Redirect(routes.UserApplication.register)) { user => request =>
val rs = Topic.getMyPagination(user.id, 1, 20)
Ok(views.html.user.fans(Some(user)))
}
}

OK,手工。

Copyright © Linux教程網 All Rights Reserved