【问题标题】:Decorating a Scala Play Controller with Java class Secured extends Security.Authenticator使用 Java 类 Secured 装饰 Scala Play 控制器扩展了 Security.Authenticator
【发布时间】:2015-07-02 22:45:09
【问题描述】:

我正在将 Java 中的 Play 2.3 应用程序重构为 Scala。现有的 Java 控制器被这样装饰以进行身份​​验证。

@Security.Authenticated(Secured.class) public class Application extends Controller { ... }

Secured.java 的签名是:

public class Secured extends Security.Authenticator { ... }

如何使用相同的 Secured.java 装饰我的 Scala 控制器?

我尝试不这样做,通过编写第二个 Secured2.scala 作为 trait 并在 Play 中以 Scala 方式进行身份验证,但许多现有模板依赖 Secured.java 来获取当前用户,这就是为什么我试图让我的 Scala 控制器与 Java Secured 类兼容。

【问题讨论】:

标签: scala authentication playframework playframework-2.3


【解决方案1】:

我认为您不能使用相同的 Java 类使用 scala API 进行身份验证。但这里是你使用 scala API 的方法,你可以用你的 Secured 类代码来填补空白:

trait Authentication {
  // Define what you want your auth header to be
  val AUTH_TOKEN_HEADER = "X-AUTH-TOKEN"

  object Authenticated extends Security.AuthenticatedBuilder(checkHeader(_), onUnauthorized(_))

  def checkHeader(request: RequestHeader): Option[String] = {
    request.headers.get(AUTH_TOKEN_HEADER) flatMap { token =>
      // do a check to see if there is a user and get their name
    }
  }

  def onUnauthorized(request: RequestHeader) = {
    // Do something when the user isn't authorized to access a route
    Results.Unauthorized
  }
}

trait SecuredController extends Controller with Authentication

这是它在实际控制器中的外观:

object SomeController extends SecuredController {
  def someApi = Authenticated { req =>
    // do something
    // The username is available in the request
    val username: String = req.user
    Ok
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 2019-07-20
    • 2021-07-07
    • 1970-01-01
    • 2017-12-07
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多