2016-11-27 3 views
2

Webプロジェクトのすべてのページに現在の認証済みユーザーを表示します。 私はユーザのアクセスを制限するために@Security.Authenticated注釈を使用します。 私はuser_idセッション値を使用して現在のユーザーデータフォームDBを取得する認証ロジック(メソッド)を持っています。Play Frameworkプロジェクトのすべてのアクションとビューの共通コード

ので、解決するためにいくつかの問題があります。私はすべてのコントローラのすべてのアクションの前にそれを実行するためにgetCurrentUser()方法を置くべき

  1. currentUserの値をすべてのビューで使用できるようにするにはどうすればよいですか?
  2. 特定の操作の認証をスキップする方法はありますか。

私が今行っているのは、1つのアクションのためだけです。私は他のアクションのためにこのコードを繰り返したくないのですか?私はそれがプロジェクト全体のために働く必要があります。

  • currentUser値を取得するために、すべてのアクションの前にgetCurrentUser()を実行します。
  • ビュー

コントローラにcurrentUser値を使用可能にする:私はには、このビューのコードを配置するつもりです

@(currentUser: User) 

<p>Hello, @currentUser.name</p> 

@Security.Authenticated(Secured.class) 
public class UsersController extends Controller { 

    public Result index() { 
     return ok(index.render(getCurrentUser())); 
    } 

    private User getCurrentUser() { 
     return User.find.byId(Long.parseLong(request().username())); 
    } 
} 

ビュー(index.scala.html) main.scala.htmlすべてのビューで共有されるファイル。

+0

ミドルウェアとしてフィルタがありますが、これらを使用することができます。 – Reactormonk

答えて

1

質問のパート1: Play HTTPフィルタを使用すると、すべてのhttp要求を傍受することができます。あなたはthisを読むことができます。

質問のパート2の場合:「currentUser」をメモリに保持することで、正確に何を得たいかによって異なります。あなたはPOJOを記憶しておきたいですか?または、ユーザーの文字列表現(潜在的にJSON)ですか?そしてどれくらい?

POJOが必要な場合は、Http.Context.argsを使用できます。これにより、マップをメモリに保存することができます。ただし、有効なPER要求のみです。ここにはJavaDocがあります。

メモリ内の文字列を長く保持するメカニズムは他にもあります。 www.playframework.com/documentation/2.5.x/JavaSessionFlashにあるFlashまたはSession Scopeを使用することができます。

Flashスコープは、セッションのNEXT要求までメモリ内に文字列を保持します。セッションの技術的なタイムアウトがないため、セッションの有効期間はセッションの長さになります(これは予想より長くなる可能性があります)。これらの文字列は、JSONの可能性があります。

HTTP要求よりも長いPOJOを格納する別の方法があります。 PlayキャッシュAPIです。ここで詳しく読むことができます:www.playframework.com/documentation/2.5.x/JavaCache

独自のカスタムキャッシュも実装できます。

最後に、APIエンドポイントを使用してUSERを取得することもできます。これは高価かもしれませんが、それは依存しています。また、このアプローチをある種のキャッシュと共に使用することもできます。

考慮すべきいくつかの質問:

  1. 私はメモリに保持する必要がある最小の表現とは何ですか?
  2. これを維持するために必要な最小限の時間は何ですか?
  3. どのような表現形式が必要ですか?文字列? JSON? POJO?
  4. 誰がこの表現にアクセスする必要がありますか?クライアント?サーバ?

P.私は低い担当者を持っているので、一度に2つ以上のリンクを投稿することはできません。そのため、一部の「リンク」がテキストとして投稿されます。

+0

ありがとうございます。私はこれを試してみる。私は、 'currentUser'が要求ごとに持続するようにする必要があり、それはPOJOでなければなりません。コントローラとビューからアクセスする必要があります。 – chumakoff

+0

すでに '@ Security.Authenticated'を持っていたのでフィルタを作成しませんでした。私はそこに自分のロジックを移動し、 'currentUser'を' Http.Context.args'に保存しました。あなたの助けてくれてありがとう@ dwayne-predictable-data! – chumakoff

関連する問題