• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

/loginForm?error가 발생하며 로그인이 안 됩니다.

23.09.18 20:46 작성 조회수 856

0

  • 4강을 수강하는 중에 생긴 오류입니다.
    회원가입은 정상적으로 작동하는데 로그인을 하려고 하면 아래 사진처럼 오류가 발생합니다.

  • 강의를 여러번 돌려보며 코드는 똑같이 따라했고, 콘솔에 찍히는 것을 보면 제가 로그인 하고자 하는 username도 잘 찍힙니다. (회원 정보를 찾는 것까지는 정상적인 거 같습니다)

import org.springframework.boot.web.servlet.view.MustacheViewResolver; 
// 이 import문에서 reactive로 하라고 하셨는데 그걸로 바꾸면 아래의 setCharset, setContentType 등에서 오류가 발생하여 servlet으로 하였습니다.
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        MustacheViewResolver resolver = new MustacheViewResolver();

        resolver.setCharset("UTF-8");
        resolver.setContentType("text/html;charset=UTF-8");
        resolver.setPrefix("classpath:/templates/");
        resolver.setSuffix(".html");

        registry.viewResolver(resolver);
    }
}
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public BCryptPasswordEncoder encodePwd(){
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeRequests()
                .antMatchers("/user/**").authenticated()
                .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
                .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginPage("/loginForm")
                .loginProcessingUrl("/login")
                .defaultSuccessUrl("/");
    }

답변 5

·

답변을 작성해보세요.

0

bandisnc님의 프로필

bandisnc

2024.02.17

저도 db에 생성한 계정이 있고 , 로그인시도시 loginForm?error로 이동되는 현상이 있었습니다.

SpringSecurity가 버전업으로 기존 방식이 deprecated되어서

authorizeHttpRequests(Customizer...)가 제공하는 템플릿에 강의 내용을 적용했었는데요.

이 템플릿 하단에 첨부되었던 userDetailService 블럭을 주석처리하여 해결하였습니다.

@Bean

public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

http

.csrf((csrf)->csrf.disable())

.authorizeHttpRequests((authorizeHttpRequests) ->

authorizeHttpRequests

.requestMatchers("/user/**").authenticated()

.requestMatchers("/admin/**").hasRole("ADMIN")

.requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER")

.anyRequest().permitAll()

)

.formLogin((formLogin) ->

formLogin

// .usernameParameter("username") // 파라미터로 보낼 이름값 설정하는 부분. username이라고 안쓰고 다른이름 쓰고 싶은 경우 for loadUserByUsername

// .passwordParameter("password")

.loginPage("/login")

// .failureUrl("/authentication/login?failed")

.loginProcessingUrl("/loginProc") // login주소가 호출되면 시큐리티가 낚아채서 대신 로그인 진행

.defaultSuccessUrl("/")

);

return http.build();

}

// auth에서 따로 관리하므로 해당 Bean은 불필요하다.

// @Bean

// public UserDetailsService userDetailsService() {

// PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();

// String pw = encoder.encode("password");

// UserDetails user = User.withUsername("user")

// .password("1234")

// .roles("USER")

// .build();

// UserDetails admin = User.withUsername("admin")

// .password("password")

// .roles("ADMIN", "USER")

// .build();

//

// return new InMemoryUserDetailsManager(user, admin);

// }

0

gapingbeaver1440님의 프로필

gapingbeaver1440

2023.10.11

저도 같은 에러를 겪어서 Github 소스코드랑 비교했는데 잘 돌아가더라구요. 비교해보니 저는 PrincipalDetailsService에서 @Service Annotation을 빼먹었더라구요. 서비스가 IoC가 안됬으니 로그인이 안되는 게 당연하고...

혹은 PrincipalDetails에서 전부 return true;로 되어있는지 확인해보세요.

0

김진우님의 프로필

김진우

2023.09.19

혹시 스프링 부트 몇 버전인가요?

WebSecurityConfigurerAdapter 는 이제 사용하지 않는 걸로 알고있습니다

이 강의가 꽤 오래 전 강의라서 스프링 시큐리티가 많이 바꼈더라고요..

2.7.10입니다!!
그러면 코드 자체를 바꿔야할까요??

김진우님의 프로필

김진우

2023.09.20

우선

http://localhost:8080/loginForm?error

라고 뜨는 것은 로그인 시 잘못된 아이디와 비밀번호를 입력했을 때 스프링 시큐리티가 자동적으로 보내주는 파라미터인 것 같습니다. 그래서 이건 정상 동작입니다.

혹시 아이디와 비밀번호를 입력했을 때 화이트 라벨 에러 페이지가 나오나요?

 

0

Son  Soungmin님의 프로필

Son Soungmin

2023.09.19

제가 빠트렸던건 저 부분이라서 에러가 발생했었는데 그외는 잘 모르겠네요 하루가 지났으니 저장과 서버 재실행은 무조건하셨을거같은데 에러로그를 상세히 보여주셔야 다른분들도 도와주실수있을거같아요!

콘솔에 에러 메세지 자체가 안 뜨고 저렇게 url 창에서만 error 라고 나옵니다ㅠㅠ

그래서 원인을 찾기가 너무 어렵네요..

0

Son  Soungmin님의 프로필

Son Soungmin

2023.09.19

application.yml 파일에
jpa ddl-auto: create 에서 update로 바꾸셨나요??

네!! 이미 그렇게 되어 있습니다.ㅠㅠ