Pregunta

Me siento como que estoy monopolizando la pila de Scala / ascensor, así que me disculpo, pero las preguntas siguen llegando. Esto es lo último.

Estoy tratando de restringir el acceso a cualquier cosa en el / login / * a aquellos usuarios que aún no han iniciado sesión.

Así es como yo estoy tratando de hacerlo:

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

Eso es la entrada en el mapa del sitio. Luego defino anyLoggedIn en Boot.scala este modo:

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

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

Quiero enviar los proveedores y los estudiantes a sus "hogares", respectivamente, cuando tratan de acceder a cualquier página de inicio de sesión cuando ya están conectados. Por alguna razón, (tal vez es mi lógica booleana), nunca funciona, y yo nunca llegan a las redirecciones.

¿Ideas?

Gracias

¿Fue útil?

Solución

Error común con val es definir una variable después del uso:

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

scala> println(test.f)
0

Lo que es bastante a menudo error cuando se trabaja con las condiciones SiteMap de elevación (personalmente tiendo a definirlos en la parte inferior). Para superar esto, definir su val como lazy:

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

scala> println(test.f)
1

Nota al margen

Su segunda prueba en If no parece demasiado Scalaish, que es una mezcla de estilos funcionales y de procedimiento. Hay opciones sobre cómo escribir, por favor ver sólo una variante posible:

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

Otra opción

Se puede definir un mapa estático de tipo de acceso a URI, por ejemplo.

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

A continuación, puede utilizarlo en su If como

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

el mismo se puede reescribir usando para-comprensiones:

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

Pero cuidado, si redirectMap no contiene una llave o su sessionLoginType está vacía, que está en problemas - open_! fallará, ya que no se debe aplicar a las cajas vacías. Si conoces a un valor por defecto razonable, un mejor uso .openOr defaultRedirect

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top