Scala 第2.5节门闩-2';s@subjectPresentOr从Java迁移->;斯卡拉
我正在将现有的Java Play 2.5应用程序迁移到Scala,并在视图Scala 第2.5节门闩-2';s@subjectPresentOr从Java迁移->;斯卡拉,scala,playframework,deadbolt-2,Scala,Playframework,Deadbolt 2,我正在将现有的Java Play 2.5应用程序迁移到Scala,并在视图main.Scala.html中找到以下类的用法: 我有一些直觉为什么。。。有时,例如,当用户尚未登录时,没有类型为deadbolt-2的AuthenticatedRequest[\u]的请求,而是超类类型play.api.mvc.RequestHeader,它不能正确地隐式地与其子类AuthenticatedRequest[\u]匹配 问题是为什么它首先在Java版本中工作?的Java版本不需要任何隐式请求:) 为了在S
main.Scala.html
中找到以下类的用法:
我有一些直觉为什么。。。有时,例如,当用户尚未登录时,没有类型为deadbolt-2的AuthenticatedRequest[\u]
的请求,而是超类类型play.api.mvc.RequestHeader
,它不能正确地隐式地与其子类AuthenticatedRequest[\u]
匹配
问题是为什么它首先在Java版本中工作?的Java版本不需要任何隐式请求:)
为了在Scala版本中修复它,我将使用模式匹配来包装
@subjectPresentOr
块,以发现隐式请求的动态类型,并且只有当其动态类型为AuthenticatedRequest[\u]
时,我才会显示该块并将该类型的缩小请求显式传递给@subjectPresentOr
。虽然这不是非常优雅,但我想不出任何其他方式…Java版本的Play通过ThreadLocals提供了一个Http.Context
,而Scala版本使用请求。这些可能是隐式的,也可能是显式的
查看控制器,当您将死锁添加到操作时,您将收到一个认证请求
。所以,一个非锁紧作用
def foo = Action { request =>
// request is of type Request
}
将接收类型为请求
的请求
,而相同的操作受死锁保护
def foo = actionBuilder.SubjectPresentAction().defaultHandler() { request =>
// request is of type AuthenticatedRequest
}
接收类型为AuthenticatedRequest
的请求
如果您要将请求
转换为AuthenticatedRequest
,因为您调用的模板包含死锁约束,但控制器操作不受约束,则可以使用with AuthRequestAction
:
def foo = actionBuilder.WithAuthRequestAction().defaultHandler() { request =>
// request is of type AuthenticatedRequest
}
如果您正在注入DeadboltActions
以代替ActionBuilders
,则同样适用:
def foo= deadboltActions.SubjectPresent()() { request =>
// request is of type AuthenticatedRequest
}
您还可以使用新的AuthenticatedRequest(Request,None)
@(Steve Chalonder)从现有的请求创建一个AuthenticatedRequest
的实例,并且没有主题。我认为在每个返回RequestHeader
的操作中,使用actionBuilder.WithAuthRequestAction().defaultHandler()
可以解决这个问题。顺便问一下,这是一个较短的版本:actionBuilder.WithAuthRequestAction()()
?再次感谢您的帮助和Deadbolt-2非常干净的代码,Play应该从中学习,例如,关于将Java与Scala分离的干净设计,而不是它们令人困惑的Play.x
vsPlay.api.x
。为soactionBuilder提供替代语法。WithAuthRequestAction()()
无效。有关更多详细信息,请参阅和。
def foo = actionBuilder.WithAuthRequestAction().defaultHandler() { request =>
// request is of type AuthenticatedRequest
}
def foo= deadboltActions.SubjectPresent()() { request =>
// request is of type AuthenticatedRequest
}