2

我正在尝试将 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。我正在关注死栓示例,这对我有很大帮助,但我不知道如何将隐式请求传递给行动。

我的模板是这样开始的:

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

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

4

1 回答 1

2

一个持续出现的问题是“我如何在授权行动中获得主题?”。从 Deadbolt 2.5 开始,传递给操作的请求已被替换为AuthenticatedRequest包含Option[Subject]. 由于 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")
  }
}

特征的getSubject()功能DeadboltHandler现在采用 aAuthenticatedRequest而不是 a 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))
  }
}
于 2016-02-29T07:06:37.593 回答