스프링

 

 

스프링부트 2.5 이상 SecurityConfig 설정 예

 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import hackertontest.test.config.auth.PrincipalDetailService;


@Configurable
@EnableWebSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true) // secured 어노테이션 활성화
public class SecurityConfig  {

	@Autowired
	private PrincipalDetailService  principalDetailService;
	
	// 해당 메서드의 리턴되는 오브젝트를 IoC 로 등록해 준다.
	@Bean
	public BCryptPasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}

	
	@Bean
	public AuthenticationManager authenticationManagerBean(AuthenticationConfiguration configuration) throws Exception {
		return configuration.getAuthenticationManager();
	}


	
	@Bean
    public AuthenticationProvider authenticationProvider() {
        var provider = new DaoAuthenticationProvider();
        provider.setUserDetailsService(principalDetailService);
        provider.setPasswordEncoder(passwordEncoder());
        return provider;
    }
	
	@Bean
	public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
		
		http.csrf().disable();

		http.authorizeRequests().antMatchers("/user/**").authenticated() // 인증만 되면 들어갈 수 있는 주소!!
				.antMatchers("/manager/**").hasAnyAuthority("ADMIN", "MANAGER")
				.antMatchers("/admin/**").hasAnyAuthority("ADMIN")
				.anyRequest().permitAll()

			.and()
		  	  .formLogin()	  
	          .loginPage("/auth/loginForm")  //로그인 페이지 URL 을 설정         
	          .loginProcessingUrl("/auth/loginProc") //스프링 시큐리티가 해당 주소로 요청오는  로그인을 가로채서 대신 로그인 해준다. 적지 않으면 .loginPage("/auth/loginForm") 값이 기본값 처리          
	          
	           
	          .usernameParameter("username") //로그인시 사용할 파라미터 이름으로 username (또는 email) 여기서는 username 을 지정
	          .passwordParameter("password")  //없을시 기본값 :password
	          .defaultSuccessUrl("/")    // 로그인 성공시 이동할 URL 을 설정
	          .failureUrl("/auth/loginForm/error")  // 로그인 실패시 이동할 URL 을 설정
	          .and()
	          .logout()
	          .logoutUrl("/auth/logout")
	          .logoutRequestMatcher(new AntPathRequestMatcher("/auth/logout"))  // 임의로그아웃 URL 을 설정하면당 스프링시큐리티가 해당 url 로 로그아웃 처리 . 기본 값은 logout
	          .logoutSuccessUrl("/"); //로그아웃 성공시 이동할 URL 을 설정		
		
		return http.build();
		
	}

	
	@Bean
	public WebMvcConfigurer corsConfigurer() {
		return new WebMvcConfigurer() {
			@Override
			public void addCorsMappings(CorsRegistry registry) {
				registry.addMapping("/**").allowedMethods("*");
			}
		};
	}

	
	
}

 

 

about author

PHRASE

Level 60  라이트

황소 제 이불 뜯어 먹기 , 우선 둘러대서 일을 해냈지만, 알고 보면 자기 손해였다는 말.

댓글 ( 4)

댓글 남기기

작성