Для людей, которые спешат, вот код и шаги .
В продолжении Play 2.x (Scala) это соперник Spring MVC? — Введение. В этом блоге я расширяю свой предыдущий блог « Включение авторизации» в приложение Play 2.x (Scala) для интеграции с LDAP вместо базы данных.
Опять же, могут быть лучшие способы сделать это, но сейчас нет четкой документации. При быстром поиске в Google отобразится ссылка на группу Google, а также ссылка и код Github . Все они оказали мне небольшую помощь. Поэтому я сделал 1-й шаг и поставил один из них. Я использовал Unboundid LDAP SDK «s InMemoryDirectoryServer .
В качестве первого шага нам нужно добавить следующую зависимость в Build.scala ,
"com.unboundid" % "unboundid-ldapsdk" % "2.3.1",
Затем мы реализуем в памяти вспомогательный класс LDAP LdapUtil.scala, как показано ниже:
def start(): InMemoryDirectoryServer = {
val config = new InMemoryDirectoryServerConfig("dc=org");
val listenerConfig = new InMemoryListenerConfig("test", null, 12345, null, null, null);
config.setListenerConfigs(listenerConfig);
config.setSchema(null); // do not check (attribute) schema
val server = new InMemoryDirectoryServer(config);
server.startListening();
...
server.add("dn: cn=user@test.com,dc=staticsecurity,dc=geomajas,dc=org", "objectClass: person", "locale: nl_BE",
"sn: NormalUser", "givenName: Joe", "memberOf: cn=testgroup,dc=roles,dc=geomajas,dc=org", "userPassword: password");
server.add("dn: cn=admin@test.com,dc=staticsecurity,dc=geomajas,dc=org", "objectClass: person", "locale: nl_BE",
"sn: Administrator", "givenName: Cindy", "memberOf: cn=testgroup,dc=roles,dc=geomajas,dc=org", "userPassword: password");
server
}
def authenticate(email: String, password: String): Option[Account] = {
val server = start
val conn = server.getConnection();
val entry = conn.getEntry("cn=" + email + ",dc=staticsecurity,dc=geomajas,dc=org");
val permission = entry.getAttributeValue("sn").toString
val retPass = entry.getAttributeValue("userPassword")
server.shutDown(true)
if (retPass.equals(password)) {
println("password valid")
val account = new Account(email, password, permission)
toOption(account)
} else {
None
}
}
def findByEmail(email: String): Option[Account] = {
val server = start
val conn = server.getConnection();
val entry = conn.getEntry("cn=" + email + ",dc=staticsecurity,dc=geomajas,dc=org");
val permission = entry.getAttributeValue("sn").toString
val retPass = entry.getAttributeValue("userPassword")
server.shutDown(true)
val account = new Account(email, retPass, permission)
toOption(account)
}
Если вы заметили, что обычные права пользователя — это email: = user@test.com, pwd: = пароль, а права администратора — это email: = admin@test.com, pwd: = пароль. Как и в моем предыдущем блоге, нам нужно настроить AuthConfig, как показано ниже:
trait AuthConfigImpl extends AuthConfig {
type Id = String
type User = Account
type Authority = String
val idTag = classTag[Id]
...
def resolveUser(email: Id) = LdapUtil.findByEmail(email)
...
def authorize(user: User, authority: Authority) = (user.permission, authority) match {
case ("Administrator", _) => true
case ("NormalUser", "NormalUser") => true
case _ => false
}
}
Форма входа выглядит как ниже, как в Application.scala ,
val loginForm = Form {
mapping("email" -> email, "password" -> text)(LdapUtil.authenticate)(_.map(u => (u.email, "")))
.verifying("Invalid email or password", result => result.isDefined)
}
Наконец, использование выглядит так, как показано ниже CoffeesControler.scala ,
def create = StackAction(AuthorityKey -> "Administrator") { implicit request =>
database withSession {
Ok(html.coffees.createForm(form, supplierSelect))
}
}