쇼핑몰 프로젝트 만들고있는데 구매자와 판매자 엔티티를 따로 만들었음. 또한 로그인 페이지도 따로따로 만들려고 함. /buyer/login, /seller/login 이런느낌. 스프링 시큐리티에서 멀티 로그인?을 검색하니까 Order(1) Order(2) 이런식으로 2개를 만들어서 하더라고.

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
@Order(1)
public class UserSecurityConfig {

private final AuthenticationFailureHandler CustomAuthFailureHandler;

@Bean//비밀번호 암호화
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean//시큐리티 필터
public SecurityFilterChain UserFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((auth) -> auth
.requestMatchers("/admin").hasRole("ADMIN")//admin페이지에는 ADMIN이라는 Role을 가지고 있어야 가능
.requestMatchers("/users/my/**","/contents/write","/contents/comment/**","/contents/editPage/**","/contents/delete/**").hasAnyRole("ADMIN", "USER")//여기는 ADMIN이나 USER 둘중 아무거나 있으면 가능
.requestMatchers("/", "/user/login", "/user/signup/**","/user/signup","/seller/signup","/join/loginIdCheck","/join/nickNameCheck","/contents/**","/contents","/error").permitAll()//해당 사이트면 모두 허용
.anyRequest().authenticated()//나머지는 로그인 했으면 가능
);

http.formLogin((auth) -> auth.loginPage("/user/login")//로그인 페이지
.loginProcessingUrl("/user/login")//포스트 보내면 어디로 가는지
.usernameParameter("username")
.failureHandler(CustomAuthFailureHandler)
.defaultSuccessUrl("/")
.permitAll());


http.logout((logout)->logout.logoutRequestMatcher(new AntPathRequestMatcher("/user/logout"))
.logoutSuccessUrl("/")
.invalidateHttpSession(true));

http.csrf((auth)->auth.disable());

//http.sessionManagement((auth) -> auth.maximumSessions(1).maxSessionsPreventsLogin(true));//true: 새로운 로그인 차단 false: 기존 세션 하나 삭제

//http.sessionManagement((session) -> session.sessionFixation((sessionFixation) -> sessionFixation.newSession()));//로그인 시 동일한 세션에 대한 id 변경


return http.build();
}
}
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
@Order(2)
public class SellerSecurityConfig {

private final AuthenticationFailureHandler CustomAuthFailureHandler;

@Bean//시큐리티 필터
public SecurityFilterChain SellerFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((auth) -> auth
.requestMatchers("/seller/my/**").hasAnyRole("ADMIN", "SELLER")//여기는 ADMIN이나 USER 둘중 아무거나 있으면 가능
.anyRequest().permitAll()
);

http.formLogin((auth) -> auth.loginPage("/seller/login")//로그인 페이지
.loginProcessingUrl("/seller/login")//포스트 보내면 어디로 가는지
.usernameParameter("username")
.failureHandler(CustomAuthFailureHandler)
.defaultSuccessUrl("/")
.permitAll()
);


// http.logout((logout)->logout.logoutRequestMatcher(new AntPathRequestMatcher("/seller/logout"))
// .logoutSuccessUrl("/")
// .invalidateHttpSession(true));


http.csrf((auth)->auth.disable());

//http.sessionManagement((auth) -> auth.maximumSessions(1).maxSessionsPreventsLogin(true));//true: 새로운 로그인 차단 false: 기존 세션 하나 삭제

//http.sessionManagement((session) -> session.sessionFixation((sessionFixation) -> sessionFixation.newSession()));//로그인 시 동일한 세션에 대한 id 변경


return http.build();
}

@Bean
SessionRegistry sessionRegistry(){
SessionRegistryImpl registry = new SessionRegistryImpl();
return registry;
}



@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return web -> web.ignoring().requestMatchers(PathRequest.toStaticResources().atCommonLocations())
.requestMatchers("/css/**", "style.css");
}

}

이렇게 2개의 Config를 작성했는데 2개를 모두 다 켜놓고 실행하면 오류가 발생함. 

@GetMapping("/")
public String mainPage(Model model,@AuthenticationPrincipal CustomUserDetails customUserDetails){
if(customUserDetails!=null){
model.addAttribute("user", customUserDetails.getUserEntity());
}
return "home/home";
}

로그인 하면 CustomUserDetails를 받아서 model에 user를 넣으려고 했는데 CustomUserDetails가 계속 null이라고 함. 그래서 뭐가 문제지 하고 SellerSecurityConfig를 전체 주석처리하고 실행하면 또 로그인이 잘 됨. 이거 왜이럼..?