RestHelperでLift(Scala Webframework)を使用して、WebアプリケーションとWebサービスを提供します。ユーザーはHTML形式のWebアプリケーションを使用することも、REST APIを使用して独自のサービスクライアントを代替的に作成することもできます。 htmlフォームは、重複機能を避けるために、AJAXでREST APIを使用してJQueryで主に実装されます。 HTTP Basic Auth(または類似のもの)を使用してREST APIを保護したいと思います。また、リフトの既定のログインフォームを使用してWebアプリケーションにサインインするユーザーは、追加の基本認証を実行する必要はありません(フォームベースのログイン中にセッションが既に作成されているため)。リフトでこれをどうすればいいですか?Scala Lift:フォームベースのログインとHTTP基本認証による統一認証?
現在、私はセットアップHTTP基本認証を行います。
// Use Basic Authentication
LiftRules.authentication = HttpBasicAuthentication("lift") {
case (email, password, req) => {
User.find(By(User.email, email)) match {
case Full(user) if user.password.match_?(password) => {
userRoles(List(AuthRole("user"), AuthRole(user.id.toString)))
User.logUserIn(user)
true
}
case _ => false
}
}
}
そして、次のように私の保護のREST APIのリソースを定義します。
// Protect REST API resources with Basic Auth (but only if user has no Session)
LiftRules.httpAuthProtectedResource.prepend{
case Req("api" :: "users" :: userId :: _, _, _) =>
User.currentUser match {
// if the user has already signed in per form we grant access
case Full(user) => Empty
case _ => Full(AuthRole(userId))
}
}
残念ながら、これは動作しませんとUser.currentUserは常に何を返しますユーザー。私は、これは、ユーザーセッションが要求ライフサイクルのこのフェーズでまだ初期化されていないことが原因であると考えています。
リフトには、どの認証方法が使用されているのかを明示的に保護する手段はありますか?原則として、ユーザーがどのように認証されたかは気にしません(フォーム認証、基本認証、ダイジェスト認証)。また、フォームベースのログインで認証した場合、REST APIリソースにアクセスしようとすると基本認証でチャレンジしたくないです(たとえば、REST APIにAJAXを呼び出すときにウェブアプリケーションのHTMLフォームがこれを行います)。
このようなパスワードを含める必要があるjQuery呼び出しがある場合、基本認証の使用には何の意味もありません。人々はそのパスワードを読んであなたのサイトに入ることができるでしょう – fmpwizard
正確に。なぜ、私は外部Webサービスクライアントに基本認証を使用し、Webアプリケーションをブラウズするユーザーのためにユーザーセッションでフォームログインを使ってAuhtorizationを使用したいのですか。だから、JQuery経由のAJAX呼び出しはBasic Authを使う必要はありません。彼らはすでにセッションを通じて承認されているはずです。 – gruenewa