복붙노트

[SPRING] Spring Security 3 - 항상 오류 302를 반환합니다.

SPRING

Spring Security 3 - 항상 오류 302를 반환합니다.

나는 Spring 4를 사용하여 간단한 애플리케이션을 만든다. 최근에 저는 스프링 시큐리티 3을 프로젝트에 추가하고 있지만 오류 코드 302를 항상 가져옵니다 (그래서 홈 페이지로 항상 리디렉션됩니다).

다음은 내 SecurityConfig입니다.

@Configuration
@EnableWebMvcSecurity
@ComponentScan(basePackages = { "com.moon.repository" })
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication().withUser("hello").password("world").roles("USER");
}

@Override
public void configure(WebSecurity web) throws Exception {
    web
    .ignoring().antMatchers("/resources/**", "/views/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests()
            .antMatchers("/","/home").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/home")
            .loginProcessingUrl("/acct/signin")
            .and()
            .logout()
            .permitAll();
}

}

AccountController라는 컨트롤러가 있습니다.

@Controller
@RequestMapping(value = "/acct")
public class AccountController {

private final Logger logger = LoggerFactory.getLogger(AccountController.class);

@RequestMapping(value = "/signin", method = RequestMethod.POST)
public String signin(@RequestParam("username") String username,
        @RequestParam("password") String password) {

    logger.info("======== [username:{0}][password:{1}] ========", username, password);

    if ("error@1.1".equalsIgnoreCase(username)) {
        return "error";
    } else {
        return "demo";
    }
}

}

내 WEB-INF 구조 :

WEB-INF
----views
--------home.jsp
--------demo.jsp
--------error.jsp

흐름은 다음과 같습니다.

어떤 아이디어? 나는 2 일 내내 붙어서 거의 절망에 빠지네 ...

모두 내 문제를 한번 살펴봐 줘서 고마워.

===================== 1 차 업데이트 ============= ==========

업데이트 : home.jsp의 형식

<form:form role="form" method="POST" action="acct/signin"
class="form-signin">
<div class="row">
    <div class="col-lg-5">
        <input name="username" size="20" type="email"
            class="form-control" placeholder="Email address" required
            autofocus> 
            <input name="password" type="password"
                    class="form-control" placeholder="Password" required>
                <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
    </div>
</div>
</form:form>

===================== 2 차 업데이트 ============= ==========

UserDetailsService (메모리 내 인증 사용 안함)를 구현하려고했지만 여전히 ... 같은 문제 - 오류 302

AppUserDetailsServiceImpl.java

@Component
public class AppUserDetailsServiceImpl implements UserDetailsService {

    private final Logger logger = LoggerFactory.getLogger(AppUserDetailsServiceImpl.class);

    @Override
    public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {

        logger.info("loadUserByUsername username=" + username);
        logger.info("======== {} ========",SecurityContextHolder.getContext().getAuthentication());

        if (!username.equals("hello")) {
            throw new UsernameNotFoundException(username + " not found");
        }

        // creating dummy user details
        return new UserDetails() {

            private static final long serialVersionUID = 2059202961588104658L;

            @Override
            public boolean isEnabled() {
                return true;
            }

            @Override
            public boolean isCredentialsNonExpired() {
                return true;
            }

            @Override
            public boolean isAccountNonLocked() {
                return true;
            }

            @Override
            public boolean isAccountNonExpired() {
                return true;
            }

            @Override
            public String getUsername() {
                return username;
            }

            @Override
            public String getPassword() {
                return "world";
            }

            @Override
            public Collection<? extends GrantedAuthority> getAuthorities() {
                List<SimpleGrantedAuthority> auths = new java.util.ArrayList<SimpleGrantedAuthority>();
                auths.add(new SimpleGrantedAuthority("USER"));
                return auths;
            }
        };
    }

로그에 다음이 표시됩니다.

[14/08/19 15:16:32:200][INFO ][com.moon.repository.AppUserDetailsServiceImpl][loadUserByUsername](24) loadUserByUsername username=hello
[14/08/19 15:16:32:200][INFO ][com.moon.repository.AppUserDetailsServiceImpl][loadUserByUsername](25) ======== org.springframework.security.authentication.UsernamePasswordAuthenticationToken@f1e4f742: Principal: com.moon.repository.AppUserDetailsServiceImpl$1@e3dc1b1; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@12afc: RemoteIpAddress: 127.0.0.1; SessionId: 023BC9A8B997ECBD826DD7C33AF55FC7; Granted Authorities: USER ========

해결법

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

    1.나는 당신이 로그인 프로세스를 통해 실제로 사용자를 인증하지 않았기 때문에 Spring이 / home으로 리다이렉트하고 있다고 생각한다.

    나는 당신이 로그인 프로세스를 통해 실제로 사용자를 인증하지 않았기 때문에 Spring이 / home으로 리다이렉트하고 있다고 생각한다.

    InMemoryUserDetailsManagerConfigurer (inMemoryAuthentication javadoc 참고)를 사용하면 구성된 자격 증명을 통해서만 성공적으로 로그인 할 수 있습니다. 본격적인 인증 시스템을 원한다면 (UserDetailsService 메소드를 통해) Spring 보안 설정에 UserDetailsService 구현을 제공해야한다.

    편집 : chialin.lin 함께 대화를 다음, 누락 된 구성을 한 번 인증 된 사용자를 리디렉션 할 수있는 봄 보안에 대한 defaultSuccessfulUrl 것으로 보인다.

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

    2.새롭고 간단한 SuccessHandler를 작성하지 않으려면 필터의 successfulAuthentication 메소드를 대체하고 보안 컨텍스트에서 Authentication 오브젝트를 설정 한 후에 chain.doFilter () 메소드를 호출하십시오.

    새롭고 간단한 SuccessHandler를 작성하지 않으려면 필터의 successfulAuthentication 메소드를 대체하고 보안 컨텍스트에서 Authentication 오브젝트를 설정 한 후에 chain.doFilter () 메소드를 호출하십시오.

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

    3.나에게 나는 약간 다른 유즈 케이스에서 왔지만 완벽하게 작동하기 전에 '갑자기'같은 문제가 발생했다. 내 설정 Spring에서 나머지 인터페이스를 빌드하는 ExtJs 프론트 엔드. 그것은 모두 훌륭한 좋은 일한 후 갑자기 내가 HTTP 상태 302 응답 (WTH 시작 했어?)

    나에게 나는 약간 다른 유즈 케이스에서 왔지만 완벽하게 작동하기 전에 '갑자기'같은 문제가 발생했다. 내 설정 Spring에서 나머지 인터페이스를 빌드하는 ExtJs 프론트 엔드. 그것은 모두 훌륭한 좋은 일한 후 갑자기 내가 HTTP 상태 302 응답 (WTH 시작 했어?)

    다음 예제에 따라 코드를 구현했습니다. https://octoperf.com/blog/2018/03/08/securing-rest-api-spring-security/ SimpleUrlAuthenticationSuccessHandler 선언이 있습니다. TokenAuthenticationFilter가 NoRedirectStrategy 클래스로 구성되는 4.4 SecurityConfig를 참조하십시오. 4.1 리디렉션 전략 참조

    이 NoRedirectStrategy를 AbstractAuthenticationProcessingFilter의 내 확장에 설정하지 않으면 HTTP 302 응답을 표시합니다.

  4. from https://stackoverflow.com/questions/25357518/spring-security-3-always-return-error-302 by cc-by-sa and MIT license