【问题标题】:deadbolt2 and implicit requestdeadbolt2 和隐式请求
【发布时间】:2016-06-08 19:10:06
【问题描述】:

我正在尝试将 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)

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

【问题讨论】:

  • 你的进口产品呢?
  • @manub 问题已更新
  • 您使用的是哪个版本的锁舌?如果它是 2.4.4,则将隐式请求切换为显式经过身份验证的请求。有关示例,请参阅github.com/schaloner/deadbolt-auth0-scala。当我不使用智能手机时,我会写一个正确的答案。
  • @SteveChaloner 是的,我使用的是 2.4.4。谢谢,非常感谢您的帮助!
  • @PeterKrejci 我已经更新了github.com/schaloner/deadbolt-2-scala 的文档 - 答案基于(阅读:复制/粘贴)那里。如果答案不明确,能否告诉我,以便我也可以改进文档?

标签: scala playframework deadbolt-2


【解决方案1】:

一个持续出现的问题是“我如何在授权操作中获取主题?”。从 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))
  }
}

【讨论】:

  • 非常感谢,现在一切正常!我会继续使用你的文档,当我的项目进展一点时,我会给你一个反馈。
猜你喜欢
  • 1970-01-01
  • 2016-09-25
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多