Статьи

Включение входа / аутентификации в приложение Play 2.x (Scala)

Для людей, которые спешат, вот код и шаги .

В продолжении  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 , вы получаете страницу входа в систему, как показано ниже,

Scala Secured.Authenticated-логин

Scala Secured.Authenticated-логин

Я надеюсь, что этот блог помог вам. В моем следующем блоге я покажу, как вы делаете авторизацию.