0

現在、Spring Web アプリケーションにログインメカニズムを実装しようとしていますが、Spring で使用されるセキュリティの概念について少し混乱しています。

ログインが必要なページにアクセスすると、ログイン ページに正しくリダイレ​​クトされます。ログイン後、実際のページが表示されます (今のところ問題ありません)。

このコード

    <security:http use-expressions="true" auto-config="true">
    <security:intercept-url pattern="/login" access="permitAll" />
    <security:intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
        <security:form-login login-page="/login" default-target-url="/welcome"
            authentication-failure-url="/loginfailed" />
        <security:logout logout-success-url="/logout" />
        <security:remember-me/>
     </security:http>

ただし、同じページに再度アクセスすると、もう一度ログインする必要があります。だから私はある種のセキュリティセッションが必要です。私はすでに、remember-me と session-management について多くのことを試して読みましたが、その方法を見つけることができませんでした。

誰かが私にいくつかの指示、春のドキュメントの適切な章、またはキーワードを教えてもらえますか?

ログインフォーム

<form name='f' action="<c:url value='j_spring_security_check' />"
        method='POST'>

        <table>
            <tr>
                <td>User:</td>
                <td><input type='text' name='j_username' value=''>
                </td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type='password' name='j_password' />
                </td>
            </tr>
            <tr>
                <td colspan='2'><input name="submit" type="submit"
                    value="submit" />
                </td>
            </tr>
            <tr>
                <td colspan='2'><input name="reset" type="reset" />
                </td>
            </tr>
        </table>

    </form>

LoginController.java

@RequestMapping(value="/login", method = RequestMethod.GET)
    public String login(ModelMap model) {

        return "login";

    }

    @RequestMapping(value="/loginfailed", method = RequestMethod.GET)
    public String loginerror(ModelMap model) {

        model.addAttribute("error", "true");
        return "login";

    }

    @RequestMapping(value="/logout", method = RequestMethod.GET)
    public String logout(ModelMap model) {

        return "login";

    }
4

2 に答える 2

1

ログイン後の 2 番目のリクエストでセキュリティ セッションが維持されない理由は非常に不思議です。この問題のトラブルシューティングには、いくつかのログが役立ちます。org.springframework.security問題を再現した後、トレース レベルのログオンを有効にして、ログを共有します。

ここまではコメントで十分でしたが、remember-me 機能の構成と使用法についても明確にしたかったのです。そこにも問題があったからです。

remember-me サービスは、元の質問にある単純な構成で動作するはずです。data-source-refonを指定しなかった<remember-me>ため、クライアントに発行されたトークンを保持しない、より単純で安全性の低い実装が適用されます。

必須ではありませんが、 を構成するdata-source-refことで、追加のセキュリティを得ることができます。ユーザーの記憶トークン (Cookie) が攻撃者によって盗まれ、ユーザーの ID でサイトにログインするために使用された場合、ユーザーに警告することができます。 . これは、追加の労力を投資することを検討する価値があります。

ここで重要なことは、remember-me サービスの十分に文書化されていない機能は、クライアントが名前のリクエストパラメーターを送信して、サーバーにログインを記憶するように明示的に要求する必要_spring_security_remember_meがあることです。そのため、次のスニペットのようなものをログイン フォームに挿入する必要があります。

<p>
    <label for="_spring_security_remember_me">Remember-me</label>
    <input id="_spring_security_remember_me" 
           name="_spring_security_remember_me" type="checkbox"/>
</p>

これがないと、remember-me サービスは何もできません。(完全を期すために、remember-me サービスにフラグを設定する代替オプションがありますがalwaysRemember、この構成ポイントはセキュリティ名前空間によって公開されないため、これは少し不便です)

于 2013-04-13T21:02:41.347 に答える