[SPRING] Spring Security를 사용하는 나의 어플리케이션은 로그인 페이지를 넘어 가지 않습니다.
SPRINGSpring 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.좋아, 나는 내 문제를 해결할 수 있었다. 그것은 내가 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á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(); } }
from https://stackoverflow.com/questions/22738738/my-application-with-spring-security-dont-go-beyond-login-page by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 부트 매핑 검증 코드와 MessageSource 메시지 비교 (0) | 2019.04.30 |
---|---|
[SPRING] Spring Reactive Web MVC가 Multipart-file을 처리하는 방법? (0) | 2019.04.30 |
[SPRING] 서버 응답에 파일 객체를 쓰고 서버에 파일을 저장하지 않고 어떻게 작성합니까? (0) | 2019.04.30 |
[SPRING] 최대 절전 모드 엔티티 저장시 일시적인 패턴 무시 (0) | 2019.04.30 |
[SPRING] 구성 요소 검사로 발견 된 Bean을 재정의하는 방법이 있습니까? (0) | 2019.04.30 |