Deadbolt 2 Restrict函数只有一个可能的失败代码

时间:2014-12-14 21:54:45

标签: scala playframework-2.1 deadbolt-2

这个问题可能有一些哲学方面的内容。

我在Play应用程序中一直使用Deadbolt 2(Scala),效果很好。

在查看Restrict function definition(第47行)时,我注意到它会因以下原因之一调用onAuthFailure:

  1. 会话中没有用户(没有主题)
  2. 操作未指定任何角色。
  3. 用户尝试了一项他们没有一个或多个必需角色的行动。
  4. 在我的应用程序UI中,我希望收到每个这些的不同状态代码,以便未登录的用户(条件1)将被重定向到登录页面,但条件3将更加优雅地处理一个警告(因为它们无论如何都不会造成伤害,并且可能在他们具有“只读”访问权限时偶然尝试编辑 - 可能是一个UI错误,但再次登录有点过于严厉。)

    但是,如果我不得不满足于2个状态代码,我想区分1和其他2.我可以看到如何实现这一点但是想得到其他意见甚至这样做的优点。

    如果我要实现此更改,看起来我可以在我自己的DeadboltActions特性扩展中覆盖Restrict函数。

    我对scala有点新意,所以我对如何最好地实现这些目标的其他想法持开放态度。

1 个答案:

答案 0 :(得分:0)

我决定只添加代码来区分条件1和2或3,如下所示:

在MyDeadboltHandler中:

class MyDeadboltHandler(dynamicResourceHandler: Option[DynamicResourceHandler] = None) extends DeadboltHandler {
...
  def onAuthFailure[A](request: Request[A]): Result = {
    Logger.error("authentication failure")
    val json = new JsonStatus("Failed to authenticate", -1).toJson.toString
    if(noUserInSession(request)){
      Results.Forbidden(json).withHeaders("Access-Control-Allow-Origin" -> "*")
    }
    else{
      Results.Unauthorized (json).withHeaders("Access-Control-Allow-Origin" -> "*")
    }
  }

  def noUserInSession(request:RequestHeader) = {
    username(request) match {
      case Some(u:String) => false
      case _ => true
    }
  }

这对我来说效果很好,并没有强加到Deadbolt-2的基本功能。