2013-05-24 2 views
0

스프링과 보안 프레임 워크로 애원하고 있습니다. 배우려면 앱을 개발하고 있습니다. 지금까지는 로그인 방식을 통해 사용자에게 유효성을 검사하기 위해 스프링 보안 기능이없는 응용 프로그램을 개발했습니다. 사용자가 귀하의 아이디 (사용자 이름과 비밀번호)를 검증하는 곳에서 메소드 "post"에 컨트롤러로 간다. 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"; 
     } 
    } 
... 

봄 보안의 구성 파일은 다음과 같습니다 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"에서 전체 시간입니다.

감사합니다. .

답변

0

스프링 보안은 특정 요청을 가로채는 일련의 필터를 도입합니다. 기본적으로 Spring Security는 j_spring_security_check에 대한 요청을 가로 채고 인증을 처리합니다. 이 때문에

, 당신은 Spring MVC는 당신이 몇 가지 이유로 기대하는 POST 요청 처리를 참조하지 않습니다 : 당신은 /index에 보내고 POST 결코

  1. 를 - 내가 위에서 무엇을보고, 사용자는 의지에서 GET/index 양식을 j_spring_security_check에 제출하십시오. 절대로하지 않는다 POST to /index
  2. Spring MVC가 인증 요청을 처리하도록하고 싶지는 않을 것이다. 이것은 보안 프레임 워크를 사용하는 이점이다. MVC 코드는 인증 또는 권한 부여를 처리 할 필요가 없습니다. 대신 위의 코드의

, 다음을 수행해야합니다 : 그것은 더 이상 필요 없기 때문에

  1. 이 당신의 MVC 코드에서 processSubmitLogin() 방법을 제거합니다.
  2. processSubmitLogin()의 사용자 정의 처리를 Spring Security 구성에 추가하여 동일한 사용자 환경을 유지하십시오.

processSubmitLogin() 3 일을 : 사실 오류의 경우 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 namespace을 참조하십시오.

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> 
... 

/** 
    * 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"; 
    } 

새로운 봄 보안 된 .java

새로운 컨트롤러 : 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> 

내가 할 경우 이, 사용자가 잘못된 데이터를 소개하면 브라우저가 정보를 표시하지 않습니다. 즉, 잘못된 사용자 이름/패스 검 조합

어떻게 데이터가 브라우저에 표시됩니까?

감사합니다.

관련 문제