• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

스프링 시큐리티 멀티 로그인 관련 질문드립니다.

23.07.23 00:43 작성 조회수 800

0

@Configuration 
@EnableWebSecurity
public class SecurityConfig {
	
   @Bean
   public SecurityFilterChain adminfilterChain(HttpSecurity http) throws Exception { 
	   
        http.authorizeRequests()
	    .requestMatchers("/admin/**").hasRole("ADMIN")
	    .anyRequest().authenticated()
	.and()
	.httpBasic() 
	;
        
      return http.build();
   }
   
   @Bean
   static final public InMemoryUserDetailsManager kk() { //DB연동을 안할 경우, 테스트 용으로 하는 것이다.
       UserDetails user = User.withDefaultPasswordEncoder()
           .username("user")
           .password("1111")
           .roles("USER")
           .build();
       UserDetails admin = User.withDefaultPasswordEncoder()
           .username("admin")
           .password("1111")
           .roles("ADMIN")
           .build();
       return new InMemoryUserDetailsManager(user, admin);
   }
	
}

@Configuration
class config2 {
	
	@Bean
	public SecurityFilterChain userfilterChain(HttpSecurity http) throws Exception { 
		
	    http.authorizeRequests()
	    	.requestMatchers("/user/**").hasRole("USER")
	    	.anyRequest().authenticated()
	    .and()
	    .formLogin() 
	    ;
		
	    return http.build();
	}
}

 

스프링 시큐리티가 최근부터 Bean으로 설정을 해야하며, 강의에서 나온 antmatchers()와 같은 함수명이 바뀌어 구글링을 하며 만들어보고자 도전해보고 있습니다.

해당 강의 중 "다중 보안 설정"에 대한 내용과 유사하게 구현해보고자 하였으나, 마음처럼 되지 않아 질문을 남김니다.

제가 구현하고 싶은 형태는 localhost:8080/user >> formLogin() 페이지로 이동하게 되고, 이와 다르게 localhost:8080/admin >> httpBasic() 페이지로 이동하도록 구현하고자 합니다. 하지만, 생각과는 다르게 admin 경로가 처리가 안되는 것을 확인하였습니다.

이에 대해 조언을 구하고자 합니다.

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.07.25

안녕하세요, 인프런 AI 인턴이에요. 스프링 시큐리티 멀티 로그인 관련 질문에 대해 답변드릴게요.

최근 버전의 스프링 시큐리티에서는 자바 기반의 설정을 사용하기 위해 @Configuration 어노테이션이 필요하며, @EnableWebSecurity 어노테이션을 사용하여 웹 보안을 활성화시킬 수 있습니다.

먼저, 첫 번째 SecurityConfig 클래스에서 adminfilterChain() 메소드에 HttpSecurity 객체를 인자로 받아서 처리하고 있습니다. authorizeRequests() 메소드를 사용하여 경로에 대한 접근 권한을 설정하고 있으며, hasRole("ADMIN")으로 “/admin/**” 경로에 대해 “ADMIN” 역할이 있는 사용자만 접근할 수 있도록 설정하고 있습니다. 그리고 .anyRequest().authenticated()는 나머지 모든 요청에 대해서는 인증을 요구하는 것을 의미합니다. 마지막으로 .httpBasic()을 호출하여 http 기본 인증을 사용하도록 설정하고 있습니다.

kk() 메소드는 InMemoryUserDetailsManager를 사용하여 사용자의 인메모리 인증 정보를 설정하고 있습니다. “user”와 “admin” 사용자가 각각 “USER”와 “ADMIN” 권한을 가지고 있으며, 패스워드는 “1111”로 설정되어 있습니다.

두 번째 config2 클래스에서는 userfilterChain() 메소드를 통해 “/user/**” 경로에 대해 “USER” 권한을 가진 사용자만 접근할 수 있도록 설정하고 있습니다. 마지막으로 .formLogin()을 호출하여 폼 기반 인증을 사용하도록 설정하고 있습니다.

이와 같이 각각 다른 경로와 권한에 대해 설정한 두 개의 SecurityFilterChain 빈을 생성하여 멀티 로그인을 구현하고 있습니다.

질문이 있으시면 더 도움을 드릴 수 있도록 알려주세요. 감사합니다.

김상욱님의 프로필

김상욱

질문자

2023.07.26

알려주신 정보와 같이 저도 알고 있었으나, 해당 코드를 실제 구동시

/admin/**에 대한 경로는 .httpBasic()이 호출되지만,

/user/**해당 경로에 대해서는 .formLogin()이 호출이 되지 않고 바로 페이지가 이동 성공(보안이 뚫림)을 하는 모습을 확인하였습니다. ㅠㅠ