강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của iojl12028531
iojl12028531

câu hỏi đã được viết

Bài giảng Bảo mật khởi động mùa xuân & JWT

스프링부트 시큐리티 4강 - Đăng nhập

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

Viết

·

2K

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("/");
    }
springspring-securityjwt

Câu trả lời 5

0

저도 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

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

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

0

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

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

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

iojl12028531님의 프로필 이미지
iojl12028531
Người đặt câu hỏi

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

우선

http://localhost:8080/loginForm?error

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

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

 

0

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

iojl12028531님의 프로필 이미지
iojl12028531
Người đặt câu hỏi

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

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

0

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

iojl12028531님의 프로필 이미지
iojl12028531
Người đặt câu hỏi

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

Hình ảnh hồ sơ của iojl12028531
iojl12028531

câu hỏi đã được viết

Đặt câu hỏi