使用 play2 scala 的 scala-oauth2-provider 的全球行动范围
Global scope for actions for scala-oauth2-provider with play2 scala
我在处理范围(访问级别,OAuth2)和 Scala 时遇到了麻烦。
我想要这些用例:
- 为控制器定义一个全局范围。能够为某些操作覆盖此全局参数。
- 不定义全局参数,但为每个操作指定范围
这段代码是我想要的示例:
package controllers
import scalaoauth2.provider.OAuth2Provider
import scala.concurrent.ExecutionContext.Implicits.global
class MyController extends GlobalAuthController
// define global scope
implicit val scope = Scope.User
// By default, if no parameter, the scope is the implicit value previously defined
def user = ActionWithAuth { request =>
Ok("hello user or admin")
}
def admin = ActionWithAuth(Scope.Admin) {
Ok("hello admin")
}
}
我使用 nulab/scala-oauth2-provider
库。根据文档,我创建了这个:
trait OAuth2ActionComposition {
implicit val executionContext: ExecutionContext
def ActionWithAuth[U](implicit scope: Scope): ActionBuilder[({type λ[A] = AuthInfoRequest[A, User]})#λ] = {
Logger.info("Scope : " + scope.toString)
AuthorizedActionFunction(new Users(scope)) compose Action
}
}
object OAuth2ActionComposition extends OAuth2ActionComposition {
implicit val executionContext: ExecutionContext = play.api.libs.concurrent.Execution.defaultContext
}
但是使用该代码我得到一个编译错误:第 def user = ActionWithAuth { request =>
行缺少参数类型 see this image
当我显式传递隐式参数(例如def user = ActionWithAuth(scope) { request =>
)时它起作用。卧槽!但是用起来不方便。
我不明白为什么会出现这个错误。我尝试了一些其他方法但没有成功。
我"fixed"感谢Silhouette内置com.mohiva.play.silhouette.api.Authorization
。
参见 http://silhouette.mohiva.com/docs/authorization。
确实,多亏了 Silhouette,才可以定义授权。例如。 :
case class WithProvider(provider: String) extends Authorization[User, CookieAuthenticator] {
def isAuthorized[B](user: User, authenticator: CookieAuthenticator)(
implicit request: Request[B], messages: Messages) = {
Future.successful(user.loginInfo.providerID == provider)
}
}
然后,使用这个“过滤器:
def myAction = SecuredAction(WithProvider("twitter")) { implicit request =>
// do something here
}
这些过滤器可以轻松组合。
我在处理范围(访问级别,OAuth2)和 Scala 时遇到了麻烦。 我想要这些用例:
- 为控制器定义一个全局范围。能够为某些操作覆盖此全局参数。
- 不定义全局参数,但为每个操作指定范围
这段代码是我想要的示例:
package controllers
import scalaoauth2.provider.OAuth2Provider
import scala.concurrent.ExecutionContext.Implicits.global
class MyController extends GlobalAuthController
// define global scope
implicit val scope = Scope.User
// By default, if no parameter, the scope is the implicit value previously defined
def user = ActionWithAuth { request =>
Ok("hello user or admin")
}
def admin = ActionWithAuth(Scope.Admin) {
Ok("hello admin")
}
}
我使用 nulab/scala-oauth2-provider
库。根据文档,我创建了这个:
trait OAuth2ActionComposition {
implicit val executionContext: ExecutionContext
def ActionWithAuth[U](implicit scope: Scope): ActionBuilder[({type λ[A] = AuthInfoRequest[A, User]})#λ] = {
Logger.info("Scope : " + scope.toString)
AuthorizedActionFunction(new Users(scope)) compose Action
}
}
object OAuth2ActionComposition extends OAuth2ActionComposition {
implicit val executionContext: ExecutionContext = play.api.libs.concurrent.Execution.defaultContext
}
但是使用该代码我得到一个编译错误:第 def user = ActionWithAuth { request =>
行缺少参数类型 see this image
当我显式传递隐式参数(例如def user = ActionWithAuth(scope) { request =>
)时它起作用。卧槽!但是用起来不方便。
我不明白为什么会出现这个错误。我尝试了一些其他方法但没有成功。
我"fixed"感谢Silhouette内置com.mohiva.play.silhouette.api.Authorization
。
参见 http://silhouette.mohiva.com/docs/authorization。
确实,多亏了 Silhouette,才可以定义授权。例如。 :
case class WithProvider(provider: String) extends Authorization[User, CookieAuthenticator] {
def isAuthorized[B](user: User, authenticator: CookieAuthenticator)(
implicit request: Request[B], messages: Messages) = {
Future.successful(user.loginInfo.providerID == provider)
}
}
然后,使用这个“过滤器:
def myAction = SecuredAction(WithProvider("twitter")) { implicit request =>
// do something here
}
这些过滤器可以轻松组合。