首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >deadbolt2与隐式请求

deadbolt2与隐式请求
EN

Stack Overflow用户
提问于 2016-02-25 19:52:23
回答 1查看 368关注 0票数 2

我正在尝试将Deadbolt2集成到我的play Framework2.4应用程序中。

在我的控制器中有下面的代码

代码语言:javascript
复制
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。我正在跟踪螺栓实例,这对我有很大帮助,但我不知道如何将隐式请求传递到实际操作中。

我的模板开头如下:

代码语言:javascript
复制
@(loginForm: Form[LoginForm])(implicit flash: Flash)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-29 07:06:37

一个持续不断的问题是“我如何在授权的行动中得到主体?”从DeadBolt2.5开始,传递到操作中的请求已被替换为包含AuthenticatedRequestOption[Subject]。由于2.4的用户也希望使用此功能,因此在2.4.4中包含了这个特性,这是一项重大的更改。

下面的示例使用SubjectPresent作为示例,但同样的更改也适用于所有授权约束。

当使用操作构建器时,代替

代码语言:javascript
复制
def index = actionBuilder.SubjectPresentAction().defaultHandler() { implicit request
  Ok(accessOk()) 
}

我们现在有

代码语言:javascript
复制
def index = actionBuilder.SubjectPresentAction().defaultHandler() { authRequest =>
  Future {
    Ok(accessOk()) 
  }
}

当使用动作组合时,代替

代码语言:javascript
复制
def index = deadbolt.SubjectPresent() { implicit request
    Action {
        Ok(accessOk())
    }
}

我们现在有

代码语言:javascript
复制
def someFunctionA = deadbolt.SubjectPresent()() { authRequest =>
  Future {
    Ok("Content accessible")
  }
}

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

代码语言:javascript
复制
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
  }

这对你的应用意味着什么

代码语言:javascript
复制
def login = deadbolt.SubjectNotPresent() {
  Action { implicit request =>
    Ok(login(loginForm))
  }
}

变成了

代码语言:javascript
复制
def login = deadbolt.SubjectNotPresent()() { authRequest =>
  Future {
    Ok(login(loginForm))
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35636980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档