使用scala / reactivemongo进行身份验证

时间:2015-05-21 09:13:57

标签: scala future restful-authentication play-reactivemongo

我想用scala实现play-2 auth,以便使用反应式mongo进行身份验证。我试了很多但是却无法通过它来阻止它...

这是我的用户控制器

import scala.concurrent.Future
import org.mindrot.jbcrypt.BCrypt
import play.api.Logger
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import play.api.libs.json.Json
import play.api.libs.json.Json.toJsFieldJsValueWrapper
import play.api.mvc.Action
import play.api.mvc.Controller
import play.modules.reactivemongo.MongoController
import play.modules.reactivemongo.json.collection.JSONCollection
import jp.t2v.lab.play2.auth.LoginLogout
import jp.t2v.lab.play2.auth.AuthConfig

object UserController extends Controller with MongoController {
  def collection: JSONCollection = db.collection[JSONCollection]("users")

  def create = Action.async(parse.json) { implicit request =>
    request.body.validate[User].map { user =>
      val pass = BCrypt.hashpw(user.password, BCrypt.gensalt())
      user.password = pass;
      collection.insert(user).map { lastError =>
        Logger.debug(s"Successfully inserted with LastError: $lastError")
        Created
      }
    }.getOrElse(Future.successful(BadRequest("invalid json")))
  }

  def list = Action.async {
    val cursor = collection.find(Json.obj()).cursor[User]
    val futureList = cursor.collect[List]()
    futureList.map { users => Ok(Json.toJson(users)) }
  }

  def findByEmail(email: String): Future[Option[User]] = {
    val futureItem: Future[Option[User]] = collection.find(Json.obj("email" -> email)).one[User]
   futureItem
  }

  def findByUsername(username: String): Future[Option[User]] = {
    val futureItem: Future[Option[User]] = collection.find(Json.obj("username" -> username)).one[User]
    futureItem
  }


}

这是BasicAuthConfig

import scala.annotation.implicitNotFound
import scala.concurrent.ExecutionContext
import scala.concurrent.Future
import scala.reflect.ClassTag
import scala.reflect.classTag

import com.loven.web.user.UserController

import jp.t2v.lab.play2.auth.AuthConfig
import play.Logger
import play.api.mvc.RequestHeader
import play.api.mvc.Results.Forbidden

trait BaseAuthConfig extends AuthConfig {

  type Id = String
  type User = com.loven.web.user.User
  type Authority = String

  val idTag: ClassTag[Id] = classTag[Id]
  val sessionTimeoutInSeconds = 3600

  def resolveUser(username: String)(implicit ctx: ExecutionContext) = Future.successful(UserController.findByUsername(username))
  def authorizationFailed(request: RequestHeader)(implicit ctx: ExecutionContext) = throw new AssertionError("don't use")
  override def authorizationFailed(request: RequestHeader, user: User, authority: Option[Authority])(implicit ctx: ExecutionContext) = {
    Logger.info(s"authorizationFailed. username: ${user.username}, authority: $authority")
    Future.successful(Forbidden("no permission"))
  }
  def authorize(user: User, authority: Authority)(implicit ctx: ExecutionContext) = Future.successful((user.role, authority) match {
    case ("admin", _)         => true
    case ("normal", "normal") => true
    case _                    => false
  })

}

我在这一行收到错误

def resolveUser(username: String)(implicit ctx: ExecutionContext) = Future.successful(UserController.findByUsername(username))

1 个答案:

答案 0 :(得分:0)

<asp:BoundField DataField="destination_ip" HeaderText="Destination IP" /> 返回UserController.findByUsername(username)

所以Future[Option[User]]表示Future.successful(UserController.findByUsername(username))

Future[Future[Option[User]]]期待resolveUser

你应该写如下

Future[Option[User]]

BTW,我不建议BaseAuthConfig依赖于控制器。

相关问题