복붙노트

[SPRING] Spring Security를 ​​사용하는 나의 어플리케이션은 로그인 페이지를 넘어 가지 않습니다.

SPRING

Spring Security를 ​​사용하는 나의 어플리케이션은 로그인 페이지를 넘어 가지 않습니다.

방금 XML 대신 Java 구성을 사용하는 인증을 위해 Spring Security를 ​​사용하여 프로젝트를 시작했습니다. 그건 내 클래스 SecurityConfig.java :

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("kleber")
                .password("123")
                .roles("USER");
    }

    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .disable()
            .authorizeRequests()
                .antMatchers("/css/**", "/fonts/**", "/image/**", "/js/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/spring/index").permitAll()
                            .loginProcessingUrl("/spring/login").permitAll()
                .usernameParameter("login")
                .passwordParameter("senha")
                .defaultSuccessUrl("/spring/home")
                .failureUrl("/spring/erro-login")
                .and()
            .logout()
                .logoutUrl("/spring/logout")
                .logoutSuccessUrl("/spring/index").permitAll();
    }

}

이 구성을 사용하면 로그인 페이지에 연결할 수 있지만 내 자격 증명 (사용자 이름 및 비밀번호)을 알려주면 사용자 이름과 비밀번호를 알았음에도 불구하고 시스템이이 로그인 페이지로 돌아갑니다.

SecurityConfig 클래스에 통지 된이 모든 URL은이 컨트롤러에 매핑됩니다.

@Controller
@RequestMapping(value="spring")
public class SpringController {

    @RequestMapping(value="index")
    public ModelAndView index() {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("index");
        return mav;
    }

    @RequestMapping(value="home")
    public ModelAndView home() {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("home");
        return mav;
    }

    @RequestMapping(value="doLogin", method=RequestMethod.POST)
    public void doLogin(HttpServletRequest request, HttpServletResponse response) {
        //
    }

    @RequestMapping(value="logout")
    public void logout(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.getSession().invalidate();
        response.sendRedirect(request.getContextPath());
    }

}

내가 뭘 잘못하고 있니?

-> 위의 주제와 관련이 있습니다.

내 컨트롤러에 매핑 된이 'loginProcessingUrl'구현해야합니다.

@RequestMapping(value="doLogin", method=RequestMethod.POST)
public void doLogin(HttpServletRequest request, HttpServletResponse response) {
    //
}

나는 이미 내가 읽은 기사에 따르면이 과정을 위해 필요할 것이지만, 나는 틀릴 수도 있고 아마도 다른 접근법을 필요로하는 두 가지 수업을 나의 응용 프로그램에 가지고있다 :

샘플 AuthenticationManager

public class SampleAuthenticationManager implements AuthenticationManager {
  static final List<GrantedAuthority> AUTHORITIES = new ArrayList<GrantedAuthority>();

  static
  {
    AUTHORITIES.add(new SimpleGrantedAuthority("ROLE_USER"));
  }

  public Authentication authenticate(Authentication auth) throws AuthenticationException
  {
    if (auth.getName().equals(auth.getCredentials()))
    {
        return new UsernamePasswordAuthenticationToken(auth.getName(), auth.getCredentials(), AUTHORITIES);
    }
    throw new BadCredentialsException("Bad Credentials");
  }

}

기본 AuthenticationProcessingFilter

    public class DefaultAuthenticationProcessingFilter extends AbstractAuthenticationProcessingFilter {

    private static final String INTERCEPTOR_PROCESS_URL = "/spring/doLogin";

    private static AuthenticationManager am = new SampleAuthenticationManager();

    protected DefaultAuthenticationProcessingFilter() {
        super(INTERCEPTOR_PROCESS_URL);
        // TODO Auto-generated constructor stub
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
        // TODO Auto-generated method stub

        String login = request.getParameter("login");
        String senha = request.getParameter("senha");

        Authentication input = new UsernamePasswordAuthenticationToken(login, senha);
        Authentication output = null;
        try {
            output = am.authenticate(input);
            SecurityContextHolder.getContext().setAuthentication(output);
            getSuccessHandler().onAuthenticationSuccess(request, response, output);
        } catch (AuthenticationException failed) {
            getFailureHandler().onAuthenticationFailure(request, response, failed);
        }

        return output;
    }

}

이 시나리오에서는 컨트롤러에서 doLogin 메소드를 어떻게 구현해야합니까? 이 순간 나는 inMemory 인증을 사용하고 있습니다. 나중에 데이터베이스 사용을 위해 프로젝트를 확장 할 수 있습니다.

해결법

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

    1.좋아, 나는 내 문제를 해결할 수 있었다. 그것은 내가 SecurityConfig와 URL에 대한 정보를 URL에 표시하는 방식으로 발생합니다. 나는 미래에 기억할 필요가있다 : 클래스에서 항상 //를 사용하라. 보기에서는 항상 사용하십시오.

    좋아, 나는 내 문제를 해결할 수 있었다. 그것은 내가 SecurityConfig와 URL에 대한 정보를 URL에 표시하는 방식으로 발생합니다. 나는 미래에 기억할 필요가있다 : 클래스에서 항상 //를 사용하라. 보기에서는 항상 사용하십시오.

    필자의 경우보기는 다음과 같이 작성되었습니다.

    index.jsp -> 로그인 페이지

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    <c:url value="/spring/login" var="loginUrl"/>
    <form method="post" action="${loginUrl}">
        usu&aacute;rio: <input type="text" name="login" size=20> <br/>
        senha: <input type="password" name="senha" size=20> <br/>
        <input type="submit" value="entrar"> <br/>
    </form>
    
    </body>
    </html>
    

    home.jsp -> "운명"페이지 (대시 보드) :이 프로젝트 상태에서 테스트 목적으로 만 사용

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    <h2>
        <c:out value="${pageContext.request.remoteUser}"/>
        <a href="<c:out value="${pageContext.request.contextPath}/spring/logout"/>">Logout</a>
    </h2>
    
    </body>
    </html>
    

    SecurityConfig.java 클래스의 최종 코드

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Autowired
        public void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth
                .inMemoryAuthentication()
                    .withUser("kleber")
                    .password("123")
                    .roles("USER");
        }
    
        protected void configure(HttpSecurity http) throws Exception {
            http
                .csrf()
                    .disable()
                .authorizeRequests()
                    .antMatchers("/css/**", "/fonts/**", "/image/**", "/js/**").permitAll()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/spring/index").permitAll()
                    .loginProcessingUrl("/spring/login").permitAll()
                    .usernameParameter("login")
                    .passwordParameter("senha")
                    .successHandler(new CustomAuthenticationSuccessHandler())
                    .failureHandler(new CustomAuthenticationFailureHandler())
                    .and()
                .logout()
                    .logoutUrl("/spring/logout")
                    .logoutSuccessUrl("/spring/index").permitAll();
        }
    
    }
    
  2. from https://stackoverflow.com/questions/22738738/my-application-with-spring-security-dont-go-beyond-login-page by cc-by-sa and MIT license