0

私はフレームワークの春と春のセキュリティを懇願しています。学ぶために、私はアプリを開発しています。これまで、ログインフォームを介してユーザーに検証するために、春のセキュリティなしでアプリを開発しました。ユーザーがユーザー名とパスワードを入力すると、私のアプリはコントローラーに行き、メソッド「post」に移動し、そこで ID (ユーザー名とパスワード) を検証します。Validator クラスを利用します。

セキュリティを強化するためにスプリングセキュリティを導入しましたが、ユーザーがID(ユーザー名とパスワード)を導入すると、メソッドへのリダイレクトがずっと取得されない場合、アプリはコントローラーのメソッドポストにリダイレクトしません

次はソースコードです

形式の jsp ファイルは次のとおりです。

...
<form:form name="f" commandName="usuario" action="j_spring_security_check" method="POST" >
    <table align="center">
        <tr>
                <td><form:errors path="errorUsuario" cssClass="error"/></td>
            </tr>
    </table>
    <table border="0" cellpadding="2" cellspacing="3">
    <tbody>
             <tr>
                    <td><span id="letra">Usuario</span></td>
                    <td><form:input path="nombreUsuario" name='j_username' id="fondo-gris"/></td>
                 <td><form:errors path="nombreUsuario" cssClass="error"/></td>
        </tr>
        <tr>
                  <td><span id="letra">Password</span></td>
                  <td><form:password path="clave" name='j_password' id="fondo-gris"/></td>
               <td><form:errors path="clave" cssClass="error"/></td>
        </tr>
        <tr>   
                   <td colspan="3"><center><input id="botonInciar" type="submit" name="guardar" value="Iniciar Sesión"/></center></td>
        </tr>
    </tbody>
    </table>
</form:form>
...

このページのコントローラーは次のとおりです。

...
@RequestMapping(value = "/index", method = RequestMethod.GET)
    public String login(Model modelo) throws Exception {

        logger.info("LogginController --> login: ha entrado en el método GET");

        Usuario usuario = new Usuario();

        modelo.addAttribute("usuario", usuario);

        logger.info("LogginController --> login: los resultados del usuario son, userName: " + usuario.getNombreUsuario());

        return "index";
    }

    /**
     * Recoge los parámetros y redireccionamos donde necesitamos
     * @param usuario El usuario que intenta acceder al sistema
     * @param result Resultado del acceso
     * @param status Estado de lasesión
     * @return Retornamos la redirección a la página donde debe de ir tras la validación
     */
   @RequestMapping(value = "/index", method = RequestMethod.POST)
   public String processSubmitLogin(@ModelAttribute("usuario") Usuario usuario, BindingResult result, SessionStatus status) {

    logger.info("LogginController --> processSubmitLogin: ha entrado en el método POST");

    UsuarioLoggin ul = new UsuarioLoggin(usuario, usuarioService);
    new LogginValidator().validate(ul, result);

        if (result.hasErrors()) {
            return "index";
        } else {
            status.setComplete();
            return "redirect:/ok.htm";
        }
    }
...

spring-security の構成ファイルは次のとおりです。 securityApplicationContext.xml:

...
<security:http auto-config="true" use-expressions="true">
        <security:intercept-url pattern="/index" access="permitAll"/>
        <security:intercept-url pattern="/*" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/>
        <security:form-login login-page="/index"/>
    </security:http>

    <security:authentication-manager alias="authenticationManager">
        <security:authentication-provider>
            <security:jdbc-user-service data-source-ref="dataSource"/>
        </security:authentication-provider>
    </security:authentication-manager>
...

PS: テストとテスト..jsp ファイルのラベル: "j_spring_security_check" を削除すると、アプリは今までどおりに検出されましたが、ユーザーがデータを送信するためにプッシュしたときにそのままにしておくと、アプリケーションはずっとコントローラーのメソッド「get」で

ありがとう。

4

2 に答える 2

0

Spring Security は、特定のリクエストをインターセプトする一連のフィルターを導入します。デフォルトでは、Spring Security はリクエストをインターセプトしj_spring_security_check、認証を処理します。

このため、Spring MVCPOSTが期待しているリクエストを処理するのを目にすることはありません。これにはいくつかの理由があります。

  1. あなたは決してPOSTに ing していません/index- 上記の内容から、ユーザーはGET /indexにフォームを送信しj_spring_security_checkます。POSTすることはありません/index
  2. Spring MVC に認証リクエストを処理させたくないでしょう。これは、セキュリティ フレームワークを使用する利点です。MVC コードで認証や承認を処理する必要はありません。

上記のコードの代わりに、次のことを行う必要があります。

  1. processSubmitLogin()このメソッドは不要になったため、MVC コードから削除してください。
  2. processSubmitLogin()同じユーザー エクスペリエンスを実現するために、Spring Security 構成に任意のカスタム ハンドリングを追加します。

processSubmitLogin()3 つのことを行います: 実際にユーザーを認証し (これは現在、Spring Security を介して行われます)、indexエラーの場合はに転送し、ok.htm成功した場合は にリダイレクトします。最後の 2 つは、次のように Spring Security で構成されます。

<security:http auto-config="true" use-expressions="true">
    ...
    <security:form-login 
        login-page="/index"
        authentication-failure-url="index"
        default-target-url="/ok.htm"
        always-use-default-target="true"/>
</security:http>

上記の構成は、Spring Security を使用する場合のカスタム ログイン ページと一致する必要があります。上記の詳細については、form-login 名前空間を参照してください。

于 2013-05-27T03:17:01.143 に答える