deadbolt2 和隐式请求

deadbolt2 and implicit request

我正在尝试将 Deadbolt2 集成到我的游戏框架 2.4 应用程序中。

我的控制器中有以下代码

import be.objectify.deadbolt.scala.{ActionBuilders, AuthenticatedRequest, DeadboltActions}
import be.objectify.deadbolt.scala.cache.HandlerCache
import play.api.data.Form
import play.api.data.Forms._
import play.api.mvc.{AnyContent, _}
import modules.user.security.{Authenticator, HandlerKeys, MyDeadboltHandler}

class Login @Inject() (deadbolt: DeadboltActions, handlers: HandlerCache, actionBuilder: ActionBuilders) extends Controller {
    //...
    def login = deadbolt.SubjectNotPresent() {
      Action { implicit request =>
        Ok(login(loginForm))
      }
    }
}

我收到错误 missing parameter type。我正在关注 deadbolt examples,这对我有很大帮助,但我不知道如何将隐式请求转化为行动。

我的模板是这样开始的:

@(loginForm: Form[LoginForm])(implicit flash: Flash)

不使用 deadbolt.SubjectNotPresent() 直接使用 Action 效果很好。

一个不断出现的问题是 "how do I get the subject in an authorized action?"。从 Deadbolt 2.5 开始,传递给动作的请求已被替换为包含 Option[Subject]AuthenticatedRequest。由于 2.4 的用户也需要此功能,因此它已作为重大更改包含在 2.4.4 中。

以下示例以SubjectPresent为例,但相同的更改适用于所有授权约束。

使用动作生成器时,代替

def index = actionBuilder.SubjectPresentAction().defaultHandler() { implicit request
  Ok(accessOk()) 
}

我们现在有

def index = actionBuilder.SubjectPresentAction().defaultHandler() { authRequest =>
  Future {
    Ok(accessOk()) 
  }
}

使用动作组合时,代替

def index = deadbolt.SubjectPresent() { implicit request
    Action {
        Ok(accessOk())
    }
}

我们现在有

def someFunctionA = deadbolt.SubjectPresent()() { authRequest =>
  Future {
    Ok("Content accessible")
  }
}

DeadboltHandler 特征的 getSubject() 函数现在采用 AuthenticatedRequest 而不是 Request

override def getSubject[A](request: AuthenticatedRequest[A]): Future[Option[Subject]] = 
  request.subject match {
    case Some(user) => Future {request.subject}
    case None => // get from database, identity platform, cache, whatever
  }

这对您的应用意味着

def login = deadbolt.SubjectNotPresent() {
  Action { implicit request =>
    Ok(login(loginForm))
  }
}

变成

def login = deadbolt.SubjectNotPresent()() { authRequest =>
  Future {
    Ok(login(loginForm))
  }
}