0

我乞求框架弹簧和弹簧安全。为了学习,我正在开发一个应用程序。到目前为止,我已经开发了没有 spring-security 的应用程序,以通过登录表单向用户验证。当用户介绍您的用户名和密码时,我的应用程序进入控制器,方法“发布”并且在那里我验证您的 ID(用户名和密码),我使用 Validator 类

现在我已经介绍了 spring-security 以获得更多安全性,但是当用户介绍您的 ids(用户名和密码)时,如果没有重定向到方法获取,应用程序永远不会重定向到控制器的方法发布

接下来是源代码

表单的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

谢谢你回答我。我不明白您写给我的所有内容,也就是说,当您说: 1. 从您的 MVC 代码中删除 processSubmitLogin() 方法,因为它不再需要。你指的是什么?与此类似:

新建jsp文件

 ... 
   <form name="f" action="j_spring_security_check" method="post" >
       <table border="0" cellpadding="2" cellspacing="3">
          <tbody>
             <tr>
            <td><span id="letra">Usuario</span></td>
            <td><input type="text" name="j_username" id="fondo-gris"/></td>
             </tr>
             <tr>
            <td><span id="letra">Password</span></td>
            <td><input type="password" name="j_password" id="fondo-gris"/></td>
             </tr>
             <tr>   
            <td colspan="3"><center><input id="botonInciar" type="submit" name="guardar" value="Iniciar Sesión"/></center></td>
         </tr>
          </tbody>
        </table>
     </form>
...

新控制器 .java

/**
     * Método que sirve para visualizar la página principal de la aplicación
     * @param modelo
     * @return Un String con el nombre de la página
     * @throws Exception
     */
    @RequestMapping(value = "/index", method = RequestMethod.GET)
    //@RequestMapping(method = RequestMethod.GET)
    public String login(Model modelo) throws Exception {
        //modelo.addAttribute("tituloUsuario", "Listado de Usuarios");

        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 "/principal/loguear";
        return "index";
    }

新的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"
                             default-target-url="/principal/usuarios/form.htm"
                             always-use-default-target="true"
                             authentication-failure-url="/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>

如果我这样做,当用户输入错误的数据时,浏览器不会显示信息,即不正确的用户名/密码组合

数据如何在浏览器中显示?

谢谢

于 2013-05-27T14:41:58.750 回答
0

Spring Security 引入了一组过滤器来拦截某些请求。默认情况下,Spring Security 将拦截一个请求j_spring_security_check并为您处理身份验证。

因此,您将永远不会看到 Spring MVC 处理POST您所期望的请求,原因如下:

  1. 你永远不会- 从我上面看到的,用户将POST提交表单到. 从来没有一个/indexGET /indexj_spring_security_checkPOST/index
  2. 你永远不想让 Spring MVC 处理身份验证请求——这是使用安全框架的好处;您的 MVC 代码不必处理身份验证或授权。

您需要执行以下操作,而不是上面的代码:

  1. 从您的 MVC 代码中删除该processSubmitLogin()方法,因为它不再需要。
  2. 将任何自定义处理添加processSubmitLogin()到您的 Spring Security 配置中,以获得相同的用户体验。

processSubmitLogin()做 3 件事:实际验证用户身份(现在通过 Spring Security 完成),index在发生错误时转发并ok.htm在成功时重定向到。最后两个在 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 回答