Pergunta

Sinto que estou monopolizando a pilha de Scala/Lift, então peço desculpas, mas as perguntas continuam chegando. Aqui está o mais recente.

Estou tentando restringir o acesso a qualquer coisa no /Login /* aos usuários que ainda não fizeram login.

Aqui está como estou tentando fazer isso:

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

Essa é a entrada no sitemap. Então eu defino AnyLoggedin em boot.scala como assim:

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

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

Quero enviar provedores e alunos para suas "casas", respectivamente, quando tentam acessar qualquer página de login quando já estão conectadas. Por algum motivo (talvez seja minha lógica booleana), ela nunca funciona, e eu nunca o faço para os redirecionamentos.

Alguma ideia?

Obrigado

Foi útil?

Solução

Erro comum com val é definir uma variável após o uso:

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

scala> println(test.f)
0

O que é bastante erro ao trabalhar com o elevador SiteMap Condições (eu pessoalmente tendem a defini -las no fundo). Para superar isso, defina seu val Como lazy:

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

scala> println(test.f)
1

Nota

Seu segundo teste em If Não parece muito escalado, é uma mistura de estilos funcionais e processuais. Existem opções sobre como escrevê -lo, consulte apenas uma possível variante:

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

Outra opção

Você pode definir um mapa estático do tipo de login para URI, por exemplo,

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

Então você pode usá -lo em seu If Curti

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

O mesmo pode ser reescrito usando para compreensões:

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

Mas cuidado, se redirectMap não contém uma chave ou seu sessionLoginType está vazio, você está com problemas - open_! falhará, pois não deve ser aplicado a caixas vazias. Se você conhece um valor padrão razoável, melhor use .openOr defaultRedirect

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top