인프런 커뮤니티 질문&답변

유은혜님의 프로필 이미지

작성한 질문수

스프링부트 시큐리티 & JWT 강의

로그인 올바르게 해도 login?error로 갑니다

작성

·

1.1K

0

SecurityConfig.java

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final SecurityDetailsService securityDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
//                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/user/**").authenticated()
                .antMatchers("/admin/**").access("hasRole('ADMIN')")
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginPage("/login")
                .loginProcessingUrl("/login")
                .defaultSuccessUrl("/home")
                .usernameParameter("userEmail")
                .and()
                .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/login")
        ;
    }

    @Bean
    public PasswordEncoder passwordEncoder() {

        return new BCryptPasswordEncoder();
    }
}

 

SecurityDetails.java

@RequiredArgsConstructor
public class SecurityDetails implements UserDetails {

    private final UserEntity userEntity;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new GrantedAuthority() {
            @Override
            public String getAuthority() {
                return userEntity.getAuthority().toString();
            }
        });
        return authorities;
    }

    @Override
    public String getPassword() {

        return userEntity.getUserPassword();
    }

    @Override
    public String getUsername() {

        return userEntity.getUserEmail();
    }

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

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

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

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

 

SecurityDetailsService.java

@Service
@RequiredArgsConstructor
public class SecurityDetailsService  implements UserDetailsService {

    private final UserRepository userRepository;
    @Override
    public UserDetails loadUserByUsername(String userEmail) throws UsernameNotFoundException {
        UserEntity userEntity = userRepository.findByUserEmail(userEmail);
        if(userEntity != null) return new SecurityDetails(userEntity);
        return null;
    }
}

 

SecurityDetails에서 return값이 boolean인 override 받는 메소드들 다 true로 해줬고

login페이지나 home페이지에는 이미지도 없어서 문제될 게 없다고 생각되는데

도통 이유를 모르겠습니다ㅠㅠㅠ

 

 

답변 1

0

유은혜님의 프로필 이미지
유은혜
질문자

알아냈습니다...

loadUserByUsername

위 메소드는 UserDetailsService에 정의된 메소드에요

그래서 아이디를 username, 비밀번호는 password가 아닌 다른 이름, 다른 걸 받을 경우

config에 이를 명시해줘야 합니다.

명시 방법은 다음과 같아요.

 

.usernameParameter("userEmail")
.passwordParameter("userPassword")

저는 username이 아닌 userEmail

password가 아닌 userPassword라는 이름으로 값을 받습니다.

 

password라는 이름에 해당하는 값이 없으니 로그인이 안됐던 거에요..하하하하

 

최주호님의 프로필 이미지
최주호
지식공유자

맞습니다 ㅎㅎㅎ

너무감사합니다.덕분에 해결했습니다.