2012-02-19 20 views
3

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フォームがこれを行います)。

+0

このようなパスワードを含める必要があるjQuery呼び出しがある場合、基本認証の使用には何の意味もありません。人々はそのパスワードを読んであなたのサイトに入ることができるでしょう – fmpwizard

+0

正確に。なぜ、私は外部Webサービスクライアントに基本認証を使用し、Webアプリケーションをブラウズするユーザーのためにユーザーセッションでフォームログインを使ってAuhtorizationを使用したいのですか。だから、JQuery経由のAJAX呼び出しはBasic Authを使う必要はありません。彼らはすでにセッションを通じて承認されているはずです。 – gruenewa

答えて

1

LiftRules.httpAuthProtectedResourceで実行されるコードは、ステートレススコープで実行されます。したがって、以前に生成されたSessionVarsにはアクセスできません。

私の目にあなたのケースを実現する1つの方法は次のとおりです。

  1. は、セッション - をチェックするステートフルな範囲で第2のAPIを作成し
  2. を基本認証を使用するステートレスな範囲でのRESTful APIを作成します認証。

認証を実行した後、適切にrewrite-rulesを使用してマップすることができます。