Si los valores en Boot.scala (Scala Ascensor)
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
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