Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Mar 27th, 2012  |  syntax: Scala  |  size: 1.42 KB  |  hits: 46  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. package com.edropple.velvetrope.actions
  2.  
  3. import com.edropple.velvetrope.user.roles.Role
  4. import play.api.mvc._
  5. import play.api.mvc.BodyParsers._
  6. import play.api.Play
  7. import com.edropple.velvetrope.user.{RoleOwner, VelvetropeGlobal}
  8.  
  9. /**
  10.  * The base trait for ACL'd controllers. Mixing this into your controller
  11.  * allows you to use AccessControlled in your action definitions.
  12.  *
  13.  * @author eropple
  14.  * @since 26 Mar 2012
  15.  */
  16.  
  17. trait AccessControlled {
  18.     private lazy val global = Play.current.global.asInstanceOf[VelvetropeGlobal]
  19.    
  20.     def AccessControlled(role: Role): AccessControlledBase[AnyContent] = AccessControlled(role, parse.anyContent)
  21.    
  22.     def AccessControlled(roles: Seq[Role]) : AccessControlledBase[AnyContent] = AccessControlledBase(roles, parse.anyContent)
  23.     def AccessControlled[A](role: Role, bp: BodyParser[A]) = AccessControlledBase(Seq(role), bp)
  24.  
  25.  
  26.     case class AccessControlledBase[A](roles: Seq[Role], bp: BodyParser[A]) {
  27.         def apply( f: (RoleOwner, Request[A]) => Result ): Action[A] = {
  28.             Action(bp) { request => {
  29.                     val user: Option[RoleOwner] = global.getRoleOwner(request)
  30.                
  31.                     if (user.isEmpty) {
  32.                         global.onAuthorizationFailure(user, request)
  33.                     }
  34.  
  35.                     f(user.get, request) // WHY ARE YOU MISMATCHING
  36.                 }
  37.             }
  38.         }
  39.     }
  40. }