2

我觉得我正在垄断 Scala/Lift 的堆栈,所以我很抱歉,但问题不断出现。这是最新的。

我正在尝试将访问 /login/* 中的任何内容限制为尚未登录的用户。

这是我尝试的方法:

val entries = Menu(Loc("Home", List("index"), "Home")) ::  //login stuff
    Menu(Loc("loginBase", ("login"::""::Nil)->true, "Login Base", Hidden, anyLoggedIn))::...

这就是 SiteMap 中的条目。然后我在 Boot.scala 中定义 anyLoggedIn,如下所示:

val anyLoggedIn  = If(() => !(Student.loggedIn_? || Provider.loggedIn_?), 
            if (sessionLoginType.is map {_ == StudentLogin} openOr false)
            {
                println("student")
                RedirectResponse("studentHome")

            }
            else 
            {
                println("provider")
                RedirectResponse("providerHome")
            }

我想分别将提供者和学生发送到他们的“家”,当他们尝试访问任何登录页面时,他们已经登录。出于某种原因,(可能是我的布尔逻辑),它永远不会工作,我也永远不会成功到重定向。

有任何想法吗?

谢谢

4

1 回答 1

2

常见的错误val是在使用后定义一个变量:

scala> object test {  
     | val f = x      
     | val x = 1      
     | }
defined module test

scala> println(test.f)
0

在使用 Lift 的条件时,这通常是错误的SiteMap(我个人倾向于在底部定义它们)。要克服这个问题,请将您的定义vallazy

scala> object test {  
     | val f = x      
     | lazy val x = 1 
     | }
defined module test

scala> println(test.f)
1

边注

您的第二个测试If看起来并不太 Scalaish,它是功能和程序样式的混合。关于如何编写它有多种选择,请仅查看一种可能的变体:

sessionLoginType.is match {
  case Full(StudentLogin) => 
    println("student")
    RedirectResponse("studentHome")
  case Full(ProviderLogin) =>
    println("provider")
    RedirectResponse("providerHome")
}

另外一个选项

您可以定义从登录类型到 uri 的静态映射,例如

val redirectMap = Map(StudentLogin -> "studentHome", ProviderLogin -> "providerHome")

然后你可以按照你的方式使用If

sessionLoginType.is.flatMap{ redirectMap.get }.map{ RedirectResponse _ }.open_!

同样可以使用 for-comprehensions 重写:

(for {val loginType <- sessionLoginType.is
      val uri <- redirectMap.get(loginType) }
      yield RedirectResponse(uri)
).open_!

但请注意,如果redirectMap不包含密钥或您的sessionLoginType为空,则您有麻烦 -open_!将失败,因为它不应该应用于空框。如果你知道一个合理的默认值,最好使用.openOr defaultRedirect

于 2009-10-11T07:00:55.753 回答