Domanda

Mi sento come se fossi monopolizzare lo stack per Scala / ascensore, quindi mi scuso, ma le domande continuano ad arrivare. Ecco l'ultima.

Sto cercando di limitare l'accesso a qualsiasi cosa in / login / * a quegli utenti che non hanno ancora effettuato l'accesso.

Ecco come sto cercando di farlo:

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

Questo è la voce nella mappa del sito. Poi mi definisco anyLoggedIn in Boot.scala in questo modo:

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

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

Voglio inviare i fornitori e gli studenti a loro "case", rispettivamente, quando cercano di accedere a qualsiasi pagina di login quando sono già registrati nel. Per qualche motivo, (forse il suo mia logica booleana), non funziona mai, ed io mai rendere al redirect.

Tutte le idee?

Grazie

È stato utile?

Soluzione

Errore commune con val è quello di definire una variabile dopo l'uso:

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

scala> println(test.f)
0

Il che è abbastanza spesso errore quando si lavora con le condizioni di SiteMap di sollevamento (io personalmente tendo a definirli in basso). Per ovviare a questo, definire il val come lazy:

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

scala> println(test.f)
1

Nota a margine

Il secondo test in If non sembra troppo Scalaish, è un mix di stili funzionali e procedurali. Ci sono opzioni su come scrivere, si prega di vedere solo una possibile variante:

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

Un'altra opzione

È possibile definire una mappa statica dal tipo di accesso a uri, per es.

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

Quindi è possibile utilizzare nel vostro If come

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

lo stesso può essere riscritto utilizzando per-comprehensions:

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

Ma attenzione, se redirectMap non contiene una chiave o il vostro sessionLoginType è vuota, si è in difficoltà - open_! fallirà, in quanto non dovrebbe essere applicato a scatole vuote. Se conoscete un valore predefinito ragionevole, migliore utilizzo .openOr defaultRedirect

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top