Для людей, которые спешат, вот код и шаги .
В продолжении Play 2.x (Scala) это соперник Spring MVC? — Вступление. В этом блоге я покажу, как расширить Security.Authenticated стандартный Play API для реализации базовой аутентификации в вашем приложении.
Я использовал этот код play-test-security как основу для реализации аутентификации на основе Security.Authenticated .
В качестве первого шага я расширю этот класс для реализации черты безопасности, как показано ниже:
trait Secured { self: Controller => /** * Retrieve the connected user id. */ def username(request: RequestHeader) = request.session.get("email") /** * Redirect to login if the use in not authorized. */ def onUnauthorized(request: RequestHeader): Result def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user => Action(request => f(user)(request)) } }
Как указано в разделе комментариев, ясно, что делает каждый метод. Следующим шагом является выполнение шагов входа в систему, см. Application.scala, как показано ниже,
lazy val loginForm = Form( tuple( "email" -> text, "password" -> text) verifying ("Invalid user or password", result => result match { case (email, password) => { println("user=" + email + " password=" + password); val userList = Users.authenticate(email, password) userList == 1 } case _ => false })) def login = Action { implicit request => Ok(html.login(loginForm)) } /** * Handle login form submission. */ def authenticate = Action { implicit request => loginForm.bindFromRequest.fold( formWithErrors => BadRequest(html.login(formWithErrors)), user => Redirect(routes.CoffeesController.index).withSession("email" -> user._1)) } /** * Logout and clean the session. */ def logout = Action { Redirect(routes.Application.login).withNewSession.flashing( "success" -> "You've been logged out") }
Объект домена User Slick и метод аутентификации в User.scala выглядят так, как показано ниже:
object Users extends Table[User]("USER") { lazy val database = Database.forDataSource(DB.getDataSource()) // -- Parsers def email = column[String]("EMAIL", O.PrimaryKey) def name = column[String]("NAME") def password = column[String]("PASSWORD") def * = email ~ name ~ password <> (User.apply _, User.unapply _) //.... def authenticate(email: String, password: String): Int = { database withSession { implicit session => val q1 = for (u println("^^^^^^^^" + Query(q1.length).first) Query(q1.length).first } }
Наконец, CoffeesController.scala, где нам нужно переопределить метод onUnauthorized и поместить блок IsAuthenticated в каждое действие, как показано ниже:
def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Application.login()) /** * Display the paginated list. * * @param page Current page number (starts from 0) * @param orderBy Column to be sorted * @param filter Filter applied on entity names */ def list(page: Int, orderBy: Int, filter: String = "%") = IsAuthenticated { username => implicit request => database withSession { Ok(html.coffees.list( Page(Coffees.list(page, pageSize, orderBy, filter).list, page, offset = pageSize * page, Coffees.findAll(filter).list.size), orderBy, filter)) } }
Чтобы проверить, работает ли аутентификация, запустите игру,
play run
И когда вы набираете URL http: // localhost: 9000 / coffee , вы получаете страницу входа в систему, как показано ниже,
Я надеюсь, что этот блог помог вам. В моем следующем блоге я покажу, как вы делаете авторизацию.