diff options
Diffstat (limited to 'app/controllers/Authentication.scala')
-rw-r--r-- | app/controllers/Authentication.scala | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/app/controllers/Authentication.scala b/app/controllers/Authentication.scala new file mode 100644 index 0000000..f9772e2 --- /dev/null +++ b/app/controllers/Authentication.scala | |||
@@ -0,0 +1,92 @@ | |||
1 | package controllers | ||
2 | |||
3 | import play.api._ | ||
4 | import play.api.data._ | ||
5 | import play.api.data.Forms._ | ||
6 | import play.api.mvc._ | ||
7 | |||
8 | import play.api.db.slick._ | ||
9 | import play.api.db.slick.Config.driver.simple._ | ||
10 | import play.api.Play.current | ||
11 | |||
12 | import scala.concurrent.Future | ||
13 | |||
14 | import models._ | ||
15 | |||
16 | |||
17 | case class AuthRequest[A](account: Option[Views.Account] = None, request: Request[A]) extends WrappedRequest(request) | ||
18 | |||
19 | object Auth extends ActionBuilder[AuthRequest] { | ||
20 | |||
21 | def invokeBlock[A](request: Request[A], block: (AuthRequest[A]) => Future[Result]) = DB.withSession { implicit session => | ||
22 | val uuid = request.session.get(Security.username) | ||
23 | var account: Option[Views.Account] = None | ||
24 | |||
25 | if (uuid.nonEmpty) { | ||
26 | val resultSet = Views.Accounts.filter(_.userUuid === uuid).run | ||
27 | if (resultSet.nonEmpty) { | ||
28 | account = Some(resultSet.head) | ||
29 | } | ||
30 | } | ||
31 | |||
32 | block(AuthRequest(account, request)) | ||
33 | } | ||
34 | |||
35 | } | ||
36 | |||
37 | |||
38 | case class LoginData(username: String, password: String) | ||
39 | |||
40 | object Authentication extends Controller { | ||
41 | |||
42 | val loginForm = Form( | ||
43 | mapping( | ||
44 | "username" -> nonEmptyText, | ||
45 | "password" -> nonEmptyText | ||
46 | )(LoginData.apply)(LoginData.unapply) | ||
47 | verifying("Log in failed.", fields => fields match { | ||
48 | case loginData => checkLoginData(loginData.username, loginData.password) | ||
49 | }) | ||
50 | ) | ||
51 | |||
52 | def checkLoginData(username: String, password: String) = DB.withSession { implicit session => | ||
53 | Tables.Users.filter(u => u.username === username && u.userPassword === password).length.run > 0 | ||
54 | } | ||
55 | |||
56 | |||
57 | def login = Auth { implicit request => | ||
58 | if (request.account.isEmpty) { | ||
59 | Ok(views.html.pages.loginForm(loginForm)) | ||
60 | } else { | ||
61 | Redirect(routes.Application.index()) | ||
62 | } | ||
63 | } | ||
64 | |||
65 | def loginSubmit = Auth { implicit request => | ||
66 | DB.withSession { implicit session => | ||
67 | loginForm.bindFromRequest.fold( | ||
68 | formWithErrors => { | ||
69 | BadRequest(views.html.pages.loginForm(formWithErrors)) | ||
70 | }, | ||
71 | validForm => { | ||
72 | val userUuid: String = Tables.Users.filter(_.username === validForm.username).map(_.uuid).first.run | ||
73 | |||
74 | Redirect(routes.Application.index()) | ||
75 | .withSession(Security.username -> userUuid) | ||
76 | .flashing(("success", "Welcome, valuable user!")) | ||
77 | } | ||
78 | ) | ||
79 | } | ||
80 | } | ||
81 | |||
82 | def logout = Auth { implicit request => | ||
83 | if (request.account.nonEmpty) { | ||
84 | Redirect(routes.Application.index()) | ||
85 | .withNewSession | ||
86 | .flashing("success" -> "You are now logged out. Do not go to our competitor's website. Thanks.") | ||
87 | } else { | ||
88 | Redirect(routes.Application.index()) | ||
89 | } | ||
90 | } | ||
91 | |||
92 | } | ||