diff --git a/src/main/scala/app/SignInController.scala b/src/main/scala/app/SignInController.scala index d7e8248..06f11cc 100644 --- a/src/main/scala/app/SignInController.scala +++ b/src/main/scala/app/SignInController.scala @@ -3,6 +3,8 @@ import service._ import util.StringUtil._ import jp.sf.amateras.scalatra.forms._ +import util.LDAPUtil +import service.SystemSettingsService.SystemSettings class SignInController extends SignInControllerBase with SystemSettingsService with AccountService @@ -24,19 +26,11 @@ } post("/signin", form){ form => - getAccountByUserName(form.userName).collect { - case account if(!account.isGroupAccount && account.password == sha1(form.password)) => { - session.setAttribute("LOGIN_ACCOUNT", account) - updateLastLoginDate(account.userName) - - session.get("REDIRECT").map { redirectUrl => - session.removeAttribute("REDIRECT") - redirect(redirectUrl.asInstanceOf[String]) - }.getOrElse { - redirect("/") - } - } - } getOrElse redirect("/signin") + val settings = loadSystemSettings() + settings.authType match { + case "LDAP" => ldapAuthentication(form, settings) + case _ => defaultAuthentication(form) + } } get("/signout"){ @@ -44,4 +38,45 @@ redirect("/") } + /** + * Authenticate by internal database. + */ + private def defaultAuthentication(form: SignInForm) = { + getAccountByUserName(form.userName).collect { + case account if(!account.isGroupAccount && account.password == sha1(form.password)) => signin(account) + } getOrElse redirect("/signin") + } + + /** + * Authenticate by LDAP. + */ + private def ldapAuthentication(form: SignInForm, settings: SystemSettings) = { + LDAPUtil.authenticate(settings.ldap.get, form.userName, form.password) match { + case Right(mailAddress) => { + // Create or update account by LDAP information + getAccountByUserName(form.userName) match { + case Some(x) => updateAccount(x.copy(mailAddress = mailAddress)) + case None => createAccount(form.userName, "", mailAddress, false, None) + } + signin(getAccountByUserName(form.userName).get) + } + case Left(errorMessage) => defaultAuthentication(form) + } + } + + /** + * Set account information into HttpSession and redirect. + */ + private def signin(account: model.Account) = { + session.setAttribute("LOGIN_ACCOUNT", account) + updateLastLoginDate(account.userName) + + session.get("REDIRECT").map { redirectUrl => + session.removeAttribute("REDIRECT") + redirect(redirectUrl.asInstanceOf[String]) + }.getOrElse { + redirect("/") + } + } + } \ No newline at end of file