Для людей, которые спешат, вот код и шаги .
В продолжении Play 2.x (Scala) это соперник Spring MVC? — Введение , в этом блоге, я покажу, как использовать play20-auth, чтобы перейти на пример с кофе.
В качестве первого шага для этого примера нам нужно добавить зависимость в Build.scala, как показано ниже:
"jp.t2v" %% "play2.auth" % "0.9", "jp.t2v" %% "play2.auth.test" % "0.9" % "test",
Нам нужно определить объект домена Account.scala с разрешениями, как показано ниже,
object Account extends Table[Account]("ACCOUNT") { lazy val database = Database.forDataSource(DB.getDataSource()) def id = column[Int]("ID") def email = column[String]("EMAIL") def password = column[String]("PASSWORD") def name = column[String]("NAME") def permission = column[Permission]("PERMISSION") // Every table needs a * projection with the same type as the table's type parameter def * = id ~ email ~ password ~ name ~ permission <> (Account.apply _, Account.unapply _)
Чтобы объект Account мог принять объект Permission.scala в качестве одного из столбцов, нам нужно реализовать MappedTypeMapper для разрешения, как показано ниже:
implicit val PermissionTimeMapper = MappedTypeMapper.base[Permission, String]( d => Permission.stringValueOf(d), t => Permission.valueOf(t)) def valueOf(value: String): Permission = value match { case "Administrator" => Administrator case "NormalUser" => NormalUser case _ => throw new IllegalArgumentException() } def stringValueOf(value: Permission): String = value match { case Administrator => "Administrator" case NormalUser => "NormalUser" case _ => throw new IllegalArgumentException() }
Следующим шагом является реализация свойства AuthConfigImpl, расширяющего AuthConfig в Application.scala, указывающего, что такое класс User для аутентификации, что представляет собой столбец, содержащий информацию о разрешениях, и страницу перенаправления, как показано ниже:
trait AuthConfigImpl extends AuthConfig { type Id = Int type User = Account type Authority = Permission val idTag = classTag[Id] val sessionTimeoutInSeconds = 3600 def resolveUser(id: Id) = Account.findById(id) def loginSucceeded(request: RequestHeader) = Redirect(routes.CoffeesController.index) def logoutSucceeded(request: RequestHeader) = Redirect(routes.Application.login) def authenticationFailed(request: RequestHeader) = Redirect(routes.Application.login) def authorizationFailed(request: RequestHeader) = Forbidden("no permission") def authorize(user: User, authority: Authority) = (user.permission, authority) match { case (Administrator, _) => true case (NormalUser, NormalUser) => true case _ => false } }
Теперь нам нужно отправить loginForm для аутентификации пользователя в Application.scala, как показано ниже,
val loginForm = Form { mapping("email" -> email, "password" -> text)(Account.authenticate)(_.map(u => (u.email, ""))) .verifying("Invalid email or password", result => result.isDefined) }
Метод аутентификации Account.scala выглядит следующим образом:
def authenticate(email: String, password: String): Option[Account] = { findByEmail(email).filter { account => password.equals(account.password) } }
Для получения подробной информации об интеграции с действием в контроллере см. CoffeesController.scala, как показано ниже,
object CoffeesController extends Controller with AuthElement with AuthConfigImpl { def delete(pk: String) = StackAction(AuthorityKey -> Administrator) { implicit request => database withSession { Home.flashing(Coffees.findByPK(pk).delete match { case 0 => "failure" -> "Entity has Not been deleted" case x => "success" -> s"Entity has been deleted (deleted $x row(s))" }) } } }
Обратите внимание, как мы используем StackAction и проверяем права администратора в контроллере.