質問

Scala/Lift のスタックを独占しているような気がして申し訳ありませんが、質問が続きます。こちらが最新のものです。

/login/* 内のすべてへのアクセスを、まだログインしていないユーザーに制限しようとしています。

私がそれをやろうとしている方法は次のとおりです。

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

それがサイトマップのエントリです。次に、Boot.scala で anyLoggedIn を次のように定義します。

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

サイドノート

2 回目のテストは If あまりスカリッシュに見えず、機能的なスタイルと手続き的なスタイルが組み合わされています。記述方法にはオプションがありますが、考えられるバリエーションの 1 つだけを参照してください。

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 内包表記を使用して書き直すことができます。

(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