39

プレゼンテーション層にWicketAuthProjectでWicketを使用しているため、SpringSecurityと統合しました。これは、Wicketが認証のために呼び出すメソッドです。

@Override
public boolean authenticate(String username, String password) {
    try {
        Authentication request = new UsernamePasswordAuthenticationToken(
                username, password);
        Authentication result = authenticationManager.authenticate(request);
        SecurityContextHolder.getContext().setAuthentication(result);
    } catch (AuthenticationException e) {
        return false;
    }
    return true;
}

Spring Security XML構成の内容(内部)は次のとおりです。

<http path-type="regex">
    <form-login login-page="/signin"/>
<logout logout-url="/logout" />
</http>
<global-method-security secured-annotations="enabled" />
<authentication-manager alias="authenticationManager"/>
<authentication-provider user-service-ref="userService">
    <password-encoder ref="bcryptpasswordencoder" />
</authentication-provider>

セクション2.3.6。リファレンスドキュメントのセッション固定攻撃保護は次のように述べています。

セッション固定攻撃は、悪意のある攻撃者がサイトにアクセスしてセッションを作成し、別のユーザーに同じセッションでログインするように誘導する可能性がある潜在的なリスクです(セッション識別子をパラメーターとして含むリンクを送信することにより、例)。Spring Securityは、ユーザーがログインしたときに新しいセッションを作成することで、これを自動的に保護します。この保護が不要な場合、または他の要件と競合する場合は、のsession-fixation-protection属性を使用して動作を制御できます。 3つのオプションがあります:

  • mergeSession-新しいセッションを作成し、既存のセッション属性を新しいセッションにコピーします。これがデフォルトです。
  • none-何もしないでください。元のセッションは保持されます。
  • newSession-既存のセッションデータをコピーせずに、新しい「クリーンな」セッションを作成します。

認証は機能しますが、Spring Securityにかなり慣れていないので、いくつか質問があり、答えが必要です。

  • 通常、ログインの場合、認証情報をPOSTして、SpringSecurityj_spring_security_checkに実際の認証コードを実行させます。セッション固定攻撃から保護したいのですが、プログラムログインを実行したときに取得できますか?そうでない場合、それを取得するために私は何をしなければなりませんか?
  • プログラムによるログアウトを実行するにはどうすればよいですか?
  • プログラムによるログインとログアウトを使用するので、SpringがこれらのURLをインターセプトしないようにするにはどうすればよいですか?

更新: セッション固定攻撃からの保護のために、SessionUtilsクラスのメソッドを署名を使用して呼び出す必要があるようですstartNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry)

渡す必要のあるSessionRegistryインスタンスを取得するにはどうすればよいですか?そのエイリアスIDを作成する方法、またはそのIDまたは名前を取得する方法が見つかりません。

4

6 に答える 6

23

質問に対する完全な回答ではないかもしれませんが、役立つかもしれません。

プログラムによるログインを使用しない場合に呼び出されるコードですが、標準的なものは次の場所にあります。

org.springframework.security.ui.webapp.AuthenticationProcessingFilter

コードでこれに触発されたと思います。かなり似ています。

/j_spring_security_logout同様に、標準的なアプローチで にアクセスしたときに実行されるコードは、次の場所にあります。

org.springframework.security.ui.logout.LogoutFilter

LogoutFilter は複数のハンドラーを呼び出します。使用しているハンドラーは: と呼ばれている org.springframework.security.ui.logout.SecurityContextLogoutHandlerため、アプローチで同じコードを呼び出すことができます。

于 2009-06-19T11:04:51.037 に答える
8

実際、セッション固定攻撃に対してオープンになります。これを改善するために、Spring コードに再び「触発」される可能性があります。新しいセッションを作成するには、明らかに httpsession へのアクセスが必要になるため、リファクタリングが必要になる場合があります。

メソッドが表示された場合SessionUtilsstartNewSessionIfRequired.

これにより、認証が新しいセッションに移行されます。このメソッドを直接呼び出すことも、コードを少しリファクタリングすることもできます。

session.invalidate()プログラムによるログアウトに関しては、その人をログアウトする必要があるときに呼び出すだけで、それほど間違ったことはできません。これにより、一般的なセキュリティの観点から必要なすべてが実行されますが、セッションでいくつかのものをクリーンアップする必要がある場合があることに注意してください. 非常に複雑なフィルタなどのセットがあり、リクエストの残りの部分でユーザーがログアウトされていることを確認する必要がある場合は、次を追加できます。

SecurityContextHolder.getContext().setAuthentication(null);

URL のインターセプトに関しては、それらを未使用のものに設定して無視することができます。構成で傍受をオフにできるかどうかはわかりません-本当に削除したい場合は、を見てくださいAuthenticationProcessingFilter-これをカスタマイズできます。これを行う場合は、提供された名前空間を使用せずに、Spring セキュリティ xml を手動でセットアップする必要があります。ただし、それほど難しくはありません。古いドキュメントを参照すると、これを行う方法がわかります。

お役に立てれば!

于 2009-06-21T20:39:41.200 に答える
6

1)プログラムによるログアウト

  1. HttpServletRequest.getSession(false).invalidateを呼び出します
  2. SecurityContextHolder.clearContext()を呼び出す

2) Tell Spring Security NOT to intercept certain URLs, this one kind of depends on how your application url space is setup. If all your pages (except /logIn and /logout) lived at the context /myApp then you could do this:

<http ....>
  <intercept-url pattern="/myApp/**" ..>
 ....
</http>
于 2009-06-23T22:26:27.117 に答える
1

プログラムによるログインで問題が発生しました。すべてのメソッドauthenticationManager.authenticate(...)SecurityContextHolder.getContext().setAuthentication(...)メソッドを呼び出しましたが、セッションでいくつかの問題が発生しました。セッションを適切に管理するには、次の行を追加する必要がありました。

HttpSession session = request.getSession();
session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext());

これは、上記のサンプルコードからは明らかではありませんでした。詳細については、http://forum.springsource.org/showthread.php?t=69761をご覧ください。

于 2010-11-03T13:51:40.700 に答える
0

プログラムによるログアウトを行うために、をスローすることもできorg.springframework.security.core.AuthenticationExceptionます。たとえば、SessionAuthenticationException。この場合ExceptionTranslationFilter、ログアウトを開始します。

于 2010-07-16T07:27:42.060 に答える
0

これを試すことができます

    try {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }

        SecurityContextHolder.clearContext();

    } catch (Exception e) {
        logger.log(LogLevel.INFO, "Problem logging out.");
    }
于 2012-03-19T14:53:22.500 に答える