我觉得我垄断了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")
}
我想分别在他们已经登录时尝试访问任何登录页面时,将提供者和学生分别发送到他们的“家”。出于某种原因,(可能是我的布尔逻辑),它永远不会起作用,而我从来没有进入重定向。
任何想法?
由于
答案 0 :(得分:2)
val
的常见错误是在使用后定义变量:
scala> object test {
| val f = x
| val x = 1
| }
defined module test
scala> println(test.f)
0
使用Lift的SiteMap
条件时,经常会出现错误(我个人倾向于在底部定义它们)。要解决此问题,请将val
定义为lazy
:
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