使用play2有一段時間,打算寫點使用心得,但願能提升本身的同時也能幫助一些人。html
先從用戶安全着手吧。每一個網站都會用到用戶註冊,會員分級等功能安全
一、play2自身的已經提供的API,不過比較簡單,先看下APIsession
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,那麼咱們能夠在其功能上封裝一下函數
二、封裝爲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)) } } } }
上面的已經基本知足咱們需求,調用簡單,未登陸的狀況下返回登陸頁面,若是特殊的需求咱們也能夠自定義操做。spa
三、使用封裝好的traitscala
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,手工。