2011-02-02 4 views
2

以下の問題を解決する方法がわかりません。多分誰かが私にいくつかのヒントを与えることができますか?Spring Security +フィルタされたリクエストのためにセッションにカスタムユーザオブジェクトが添付されました

  1. 私はSpring SecurityでSpring MVCアプリケーションを持っています。また、カスタムのログインページも使用します。これまでのところすべて正常に動作し、次のコードを使用して、JSPでログインしているユーザーを認証して表示できます。 Logged in as <sec:authentication property="principal.username" />

    </sec:authorize>

  2. 再今、データベースからretreievedユーザー

    <sec:authorize ifAnyGranted="ROLE_USER">。 XMLでそのためのコードは

    <jdbc-user-service data-source-ref="dataSource" users-by-username-query="SELECT username, password , '1' AS enabled FROM users WHERE username = ?" authorities-by-username-query="SELECT username, 'ROLE_USER' FROM users WHERE username = ?" />

すべて正常に動作しています。問題は、私は実際に私が使用したいと思うカスタムのUserクラスを持っている可能性があります。後でDBリクエストがUser.idに記録された結果に従ってフィルタリングする必要があるため、セッションに保持しています。

どうすればよいですか?

  • 私のセッションにユーザオブジェクトを保存するには何が必要ですか?これは正しい方法ですか?
  • 私はHibernateを使用します。リクエストをフィルタリングするためのベストプラクティスは何ですか。ログインしているユーザーに応じて、「タスク」と呼ばれるオブジェクト(タスクマネージャー内)については? (私はMySQLデータベースのタスクテーブルにカラムとプロパティuser_idを持っています)

何か助けやヒントがありがとうございます。

答えて

2

Spring Security 3.xを使用している場合は、Expression Based Access Control(たとえば、@PostFilter)が要件を満たしているかどうかを確認するとよいでしょう。あなたのTaskオブジェクトがusernameメンバーを持っている場合、あなたはこのような何かを行うことができ...

@PostFilter("filterObject.username == authentication.name") 
    public List<Task> getTasks() { 
     ... 
     tasks = TaskDao.findAll(); 
     return tasks; 
    } 

これは、ログインしたユーザーに属し、これらのタスクを返します。例えば

、。

This SOの議論も関連する可能性があります。

+0

私はXMLで式を有効にしていますが、カスタムユーザーをセッションに接続し、その後のHibernate呼び出しをフィルタリングする方法がわかりません。 – Czar

+0

@ Czar。あなたのコメントに基づいて答えが更新されました。 – Raghuram

+0

@Raghuram:更新していただきありがとうございます。私はあなたのアプローチを理解しています。しかし、もう2つの質問:1.このアプローチはオーバーヘッドを大きくしないだろうか?私はそれを見ると、TaskDAO.findAll()はすべてのタスクを返しますが、返されたリストはフィルタリングされます。右?これは、DBより多くのデータを必要以上に読み込みます。 (あなたのリンクも参照してください)2.何が最善であるかを知っていますか?SecurityContextHolderの「標準」ユーザを使用し、それを使ってDAO経由でドメインオブジェクトを取得し、その後のDAO /サービス呼び出しでDomainオブジェクトのIDプロパティを使用するか、 "私"ユーザのDOmainオブジェクトを表すカスタムディテールを持つUserDetails? – Czar

関連する問題