Вопрос

У меня такое ощущение, что я монополизирую стек Scala/Lift, поэтому прошу прощения, но вопросы продолжают поступать.Вот последние новости.

Я пытаюсь ограничить доступ ко всему в /login/* тем пользователям, которые еще не вошли в систему.

Вот как я пытаюсь это сделать:

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

Это запись в SiteMap.Затем я определяю AnyLoggedIn в Boot.scala следующим образом:

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

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

Я хочу отправлять поставщиков услуг и студентов в их «дома» соответственно, когда они пытаются получить доступ к любой странице входа в систему, когда они уже вошли в систему.По какой-то причине (возможно, это моя логическая логика) это никогда не работает, и я никогда не дохожу до перенаправлений.

Есть идеи?

Спасибо

Это было полезно?

Решение

Распространенная ошибка с 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 не выглядит слишком масштабно, это смесь функционального и процедурного стилей.Есть варианты, как это написать, посмотрите только один возможный вариант:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top