0

アプリのページにアクセスするための次のルールがあります。

<http auto-config="true" use-expressions="true">
        <!-- NON AUTHENTICATION PAGES -->
        <intercept-url pattern="/" access="permitAll" />
        <intercept-url pattern="/about" access="permitAll" />       

        <!-- LOGIN FILTER -->
        <intercept-url pattern="/login" access="!isAuthenticated()" />
        <intercept-url pattern="/j_spring_security_check" access="!isAuthenticated()" />
        <intercept-url pattern="/logout" access="!isAuthenticated()" />

        <!-- RESOURCES AND OTHER URLs FILTER -->
        <intercept-url pattern="/resources/**" access="permitAll" />
        <intercept-url pattern="/**" access="isAuthenticated()" />

        <!-- FORM LOGIN -->
        <form-login login-page="/login" default-target-url="/upload" authentication-failure-url="/loginfailed"  />
        <logout logout-success-url="/logout" />
    </http>

そして、アクセスが失敗したときにいくつかのURL(/ access-deniedなど)にリダイレクトし、コントローラーでこのイベントを処理する必要があります。

@RequestMapping(value = "/access-denied", method = RequestMethod.GET)
    public String accessDenied(Model model, RedirectAttributes ra) {

    // do what I want

    return "redirect:login";
}

たとえば、ユーザーが /upload と入力すると、ログインしていないため、/access-denied にリダイレクトされます。

4

2 に答える 2

2

Spring Securityが自動的にリダイレクトを行うため、自分でリダイレクトを行う必要がある理由を説明すると役立つ場合があります。アクセスが拒否された場合、認証されていないユーザーのデフォルトの動作は、ユーザーをログインページにリダイレクトすることです(これはあなたがやりたいことのようです)。

プロセスをカスタマイズしたい場合、使用される戦略はAuthenticationEntryPoint、コントローラーを使用するよりも、これを実装する方がおそらく理にかなっているということです。これについては、以前の回答で詳しく説明しました。

追加の機能を追加するだけの場合は、LoginUrlAuthenticationEntryPointを拡張してメソッドをオーバーライドしcommence、スーパークラスを呼び出してリダイレクトを実行できます。

これはlogin-page、名前空間要素の値が使用されないことを意味することに注意してください。のコンストラクタでログインURLを設定する必要がありますLoginUrlAuthenticationEntryPoint

于 2012-07-22T16:16:56.473 に答える