복붙노트

[SPRING] Ajax를 사용하여 Spring 보안으로 로그인하기

SPRING

Ajax를 사용하여 Spring 보안으로 로그인하기

Spring Security를 ​​사용하는 Ajax 기반 로그인 시스템에서 작업을 시도하고 있는데, 인증 성공 핸들러를 구성해야하는 또 다른 요구 사항이 생길 때까지 제대로 작동 했으므로 사용자가 Spring에 의해 인증되면 일부 후 처리 작업을 수행 할 수 있습니다. 보안.

이전에는 로그인 페이지를 표시하기 위해 을 사용하지 않았습니다. 내 로그인 섹션은 전체 애플리케이션에 공통적 인 드롭 다운 및 헤더 섹션의 일부입니다.

이것은 스프링 보안을 설정하는 방법이다.

<http pattern="/customer/**" auto-config="true" use-expressions="true" authentication-manager-ref="customerAuthenticationManager">
<!--<http pattern="/customer/**" auto-config="true" use-expressions="true">-->
<intercept-url pattern="/customer/logon.html*" access="permitAll" />
<intercept-url pattern="/customer/denied.html" access="permitAll"/>
<intercept-url pattern="/customer" access="hasRole('AUTH_CUSTOMER')" />
<intercept-url pattern="/customer/" access="hasRole('AUTH_CUSTOMER')" />
<intercept-url pattern="/customer/*.html" access="hasRole('AUTH_CUSTOMER')" />
<intercept-url pattern="/customer/*/*.html" access="hasRole('AUTH_CUSTOMER')" />

<form-login login-processing-url="/customer/logon.html" login-page="/shop/home.html" 
authentication-success-handler-ref="webshopAuthenticationSuccessHandler" />

<logout invalidate-session="true" 
   logout-success-url="/customer/home.html" 
    logout-url="/customer/j_spring_security_logout" />
 <access-denied-handler error-page="/customer/denied.html"/>
    </http>

이러한 구성을 사용하면 올바른 자격 증명으로 로그인 버튼을 클릭 할 때 HTTP 302 오류가 발생합니다.

http://localhost:8080/shop/customer/logon.html 302 found

정확하게 내가 뭘 잘못하고 있는지 확실하지 않니?

<form id="login" method="post" accept-charset="UTF-8">
    <input id="userName" type="text" name="userName" size="30" />
    <button type="submit" class="btn">Login</button>
</form>
 var data = $(this).serializeObject();
  $.ajax({
  'type': 'POST',
  'url': "<c:url value="/customer/logon.html"/>",
   'contentType': 'application/json',
    'data': JSON.stringify(data),
     'dataType': 'json',
....
}}:
 Authentication authenticationToken = new UsernamePasswordAuthenticationToken(customer.getUserName(), customer.getPassword());
   try {
       Authentication authentication = customerAuthenticationManager.authenticate(authenticationToken);
        SecurityContextHolder.getContext().setAuthentication(authentication);
        resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
           } catch (AuthenticationException ex) {

            resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
   }

모든 입력? 모든 노력으로 저는 여전히 302를 얻고 있고 위의 구성으로도 내 logon.html 컨트롤러가 호출되지 않습니다.

나의 주요 문제점은 스프링 보안을

<form-login login-processing-url="/customer/logon.html" login-page="/shop/home.html" 
    authentication-success-handler-ref="webshopAuthenticationSuccessHandler" />

logon.html에서 302가 나오고 심지어 logon.html 컨트롤러가 트리거되지 않습니다 (디버거가 배치 됨).

해결법

  1. ==============================

    1.먼저 컨트롤러가 필요 없으며 스프링 보안이이 모든 것을 처리합니다. 그래서 컨트롤러를 떨어 뜨리십시오.

    먼저 컨트롤러가 필요 없으며 스프링 보안이이 모든 것을 처리합니다. 그래서 컨트롤러를 떨어 뜨리십시오.

    현재 문제는 JSON 기반 게시물 때문입니다. 이것은 login을 처리하는 일반 필터에 의해 처리되지만 j_username 및 j_password 필드는 보이지 않으므로 (302) 귀하의 경우 /shop/home.html의 login 페이지 (해당 필드를 묻는)로 리디렉션됩니다 .

    기본적으로 JSON으로 데이터를 게시하는 반면 간단히 ajaxified 양식으로 게시해야합니다. 이것은 상황이 좋을 때 단순히 401 또는 200 상태 코드 (그리고 아마도 몸체)를 반환하는 간단한 AuthenticationSuccessHandler를 작성할 수있게 해줍니다.

    이런 식으로 아약스 제출 변경하면 일을해야합니다.

    var data = $(this).serializeObject();
    $.ajax({
        'type': $(this).action,
        'url': $(this).target,
        'data': data
    }):
    

    이것은 ajax 폼 포스트를 생성해야합니다. 실제 게시에서 양식을 중지하려면 주변 메소드에서 Defect () 호출을 호출해야 할 수도 있습니다.

  2. ==============================

    2.현재 게시 된 로그인 양식으로는 다음과 같은 양식이 필요하므로 작동하지 않습니다.

    현재 게시 된 로그인 양식으로는 다음과 같은 양식이 필요하므로 작동하지 않습니다.

    <body>
      <form action="/j_spring_security_check" method="POST">
        <label for="username">User Name:</label>
        <input id="username" name="j_username" type="text"/>
        <label for="password">Password:</label>
        <input id="password" name="j_password" type="password"/>
        <input type="submit" value="Log In"/>
      </form>
    </body>
    

    게시물은 j_spring_security_check을 수행해야하며 사용자 이름과 비밀번호는 j_username 및 j_password 필드에 입력해야합니다. 그렇지 않으면 작동하지 않습니다.

    나는 당신이 로그인 페이지로 리다이렉트하고 있다고 생각한다.

    파이어 폭스를 사용하는 경우 크롬 디버거 또는 파이어 버그로 리디렉션이 어디로 이동하는지 확인할 수 있습니다.

    먼저 login-page = "/ customer / logon.html"을 삭제하여 스프링 보안에 의해 생성 된 기본 로그인 페이지로 작업하는 나머지 구성을 얻으십시오.

    이 작업이 끝나면 사용자 정의 로그인 페이지를 다시 추가 할 수 있지만 위의 요소가 있어야합니다.

    또한 아약스를 통해 서버에 JSTL 태그를 게시하려고한다고 생각합니까? 그것이 사실이라면 효과가 없으며 그렇지 않으면 질문을 편집 할 수 있습니다.

    먼저 기본 로그인 페이지를 사용한 다음, 테스트 용으로 하드 코드 된 값을 가진 ajax 요청을 사용하고 사용자 정의 로그인 페이지에서 작동하는 경우 단계별로 시도하십시오.

  3. ==============================

    3.응답 코드 (302)는 에러 표시가 아니다. 리디렉션을 수행하는 방법입니다. webshopAuthenticationSuccessHandler 코드를 공유하지 않았기 때문입니다.

    응답 코드 (302)는 에러 표시가 아니다. 리디렉션을 수행하는 방법입니다. webshopAuthenticationSuccessHandler 코드를 공유하지 않았기 때문입니다.

    그러나 나는 어떤 특정 조건을 처리 한 후 특정 리소스로 요청을 리다이렉트하고 있다고 확신한다. 헤더를 확인하고 리디렉션 URL을 얻으십시오. 그런 다음 자바 스크립트 코드로 리디렉션합니다.

    이 상태 코드가있는 HTTP 응답은 Location 헤더 필드에 URL을 추가로 제공합니다.

    예를 들어 -

    클라이언트 요청 :

    GET /index.html HTTP / 1.1

    호스트 : www.example.com

    서버 응답 :

    HTTP / 1.1 302 발견됨

    위치 : http://www.iana.org/domains/example/

    따라서이 오류 코드와 함께 http://www.iana.org/domains/example/ url을 통해 authenticationSuccessHandler가 리디렉션하여 자바 스크립트 코드를 통해 리디렉션하도록합니다.

  4. from https://stackoverflow.com/questions/20538619/login-with-spring-security-using-ajax by cc-by-sa and MIT license