2009-05-13 5 views
2

私は、ストライプと春を使用してWebアプリケーションを構築しています。ログイン/認証機能が必要です。今は、ユーザー資格情報とは別のユーザー情報をデータベースに格納しています。私の貴重なパスワードを渡したくないので、ユーザーモデルには資格情報が含まれていません。春と縞のセキュリティの設計

春は私のすべてのDAOを管理します。

ここでは、非コンテナベースのセキュリティシステムを実装しています。私は、パスワードのsha-2ハッシュを保存し、データベースに格納されているものに対してフォームで送信されたパスワードの比較を実行します。この比較はテストされ、機能しています。私はこの事を一緒に結ぶ方法を理解しようとしています。今私はLoginActionBeanを持ってログイン要求をキャッチし、内部でUserDAOを使用して資格を取得し、提出されたパラメータとの比較を実行する "PasswordService"シングルトンを使用します。私の春の豆は、次のとおりです。

<bean id="passwordSerivce" class="com.example.store.authentication.PasswordService" factory-method="getInstance"> 
    <property name="userDAO" ref="userDAO"/> 
</bean> 

しかし、それは、その後PasswordServiceシングルトンが必要です。本当に(UserDAOがインターフェイスである)シングルトンでは意味をなしません

public void setUserDAO(UserDAO userDAO) { ...} 

方法。

私は適切なデザインを探しています。私はServiceLocatorsがSpringが発明された理由だと読んだ。何かご意見は?

他にどのように私がこれを設計できるか知りたいと思います。ユーザーが「ログイン」をクリックしたときに呼び出されるActionBeanがありますが、実際にどのように認証するのですか。認証サービスをBeanに注入しますか?私は誰でも呼ぶことができるシングルトンを作りますか?私は、Springが注入するLoginAcionBeanが使用する汎用インターフェースを持っていますか?私が春を使っていなかったら、どうしたらいいのですか?

答えて

1
  1. 私はuserDaoを注入する意味が理解できません。

  2. xmlがfactory-method = "getInstance"を使用している理由はわかりません。あなたはすべてのインスタンスのものとシングルトンのものを捨てることができます。 springはパスワードサービスクラスのインスタンスをインスタンス化し、多くのクラスに必要なクラスに注入し、すべて同じインスタンスを取得します。だから春はあなたのためにシングルトンを作り出しています。パスワードサービスクラスは単純なpojoにすることができます。 userDao実装の場合も同様です。

私は春の注釈を見て、理解し、使用することをお勧めします。基本的には、注入されるクラスで@Serviceを使用し、注入されたクラスのセッターで@Autowiredを使用します。アノテーションの内容を有効にするには、XML設定ファイルに何かを追加する必要もあります。

+0

私はこれについてはっきりしているかどうかは分かりませんが、シングルトンのものは必要ありません。春はあなたのためにすべてをします。あなたはちょうどあなたの春の豆を設定し、それらはすべて効果的にシングルトンになります。非シングルトンBeanを作成するには、春を取得するために余分な回転を行わなければなりません。 – lumpynose

+0

私はそれが正しいとは思わない理由は、シングルトンクラスには "setUserDAO"メソッドがあるからです。これは、誰かがサービスを使用することによって設定できます。つまり、誰かが技術的にそれを無効にできるということです。 誰かを「認証する」正しい方法がOODの観点からだと思います。 – djunforgetable

+0

誰もがセッターに電話することができる問題について私は同意します。 Gandalfのコンストラクタの答えは、私がそれについて心配しているときに使うものです。また、セッターをプライベートにすることもできますし、アノテーション(@Autowired)を使用すると、スプリングはまだセッターを使用できます。それについて肯定的ではない。それは私の意見では本当にスケッチに見えます。 – lumpynose

1

あなたはDAOのためのセッターをしたくない場合は、単にコンストラクタ・インジェクションを使用し、上記の回答に追加:

<bean id="passwordSerivce" class="...PasswordService"> 
    <constructor-arg ref="userDAO"/> 
</bean> 

Beanはあなたがコントロールクラスではない場合を除き、あなたがする必要はありませんそれはSingletonであり、Springはデフォルトでこれを行います。

私は個人的に注釈のファンではありません。

0

私の解決策は、「認証」メソッドを使用するインターフェイスを用意することでした。次に、UserDAOオブジェクトを取り込むコンストラクタを使用して、インターフェイスを実装するサービスクラスを作成します。このようにして、サービスを必要とするオブジェクトはインスタンス化を実行せず(春までに実行されます)、実行される基本実装(LDAP、SSO、単純なパスワード比較など)を認識しません。仕事を終わらせるようです:P