카테고리 없음

SpringBoot 공개 매처

기록만이살길 2021. 2. 19. 16:18
반응형

SpringBoot 공개 매처

질문(문제점):

이 맵핑을 사용하는 Spring Boot 애플리케이션이 있습니다.

@GetMapping(value = {  "/",  })
public String home(Model model) {
}

  • localhot:8080,
  • localhost:8080/ ,
  • localhost:8080/.,
  • localhost:8080/..

리디렉션 /하지만 아닙니다

localhost:8080/...

그리고 WebSecurityConfig내가 가진 유일한 공개 매처 에서 이것은 다음 같습니다 /.

나는에 대한 액세스를 제한하고자 localhost:8080/.localhost:8080/..

여기:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    private final UserSecurityService userSecurityService;
    private final Environment env;

    private static final String SALT = "fd&l23j§sfs23#$1*(_)nof";

    public WebSecurityConfig(UserSecurityService userSecurityService, Environment env) {
        this.userSecurityService = userSecurityService;
        this.env = env;
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(12, new SecureRandom(SALT.getBytes()));
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        encodingFilter.setEncoding("UTF-8");
        encodingFilter.setForceEncoding(true);

        http.addFilterBefore(encodingFilter, CsrfFilter.class);
    
        http.csrf().disable();
    
        http
            .authorizeRequests()
                .antMatchers(publicMatchers()).permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login.html")
                .defaultSuccessUrl("/advertise.html")
                .failureUrl("/login.html?error").permitAll()
                .and()
            .logout()
                .permitAll()
                .and()
            .rememberMe()
                .key("uniqueAndSecret");
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

        auth
            .userDetailsService(userSecurityService)
                .passwordEncoder(passwordEncoder());
    }

    private String[] publicMatchers() {

        final String[] PUBLIC_MATCHERS = {
                "/webjars/**",
                "/css/**",
                "/fonts/**",
                "/images/**",
                "/img/**",
                "/js/**",
                "/home.html",
                "/links/**",
                "/links.html",
                "/favicon.ico",
                "/forgotmypassword.html",
                "/directory/**",
                "/",
                "/error/**/*",
                "/h2-console/**",
                ForgotMyPasswordController.FORGOT_PASSWORD_URL_MAPPING,
                ForgotMyPasswordController.CHANGE_PASSWORD_PATH
        };

        return PUBLIC_MATCHERS;
    }
}

해결방안:

나는 당신과 비슷한 간단한 예를 만들었습니다. 웹 브라우저가 아닌 curl로 테스트 중이며 결과는 다음과 같습니다.

  • localhost:8080/. 인터넷 서버 오류.

이 예외는 서버에서 발생합니다. org.springframework.security.web.firewall.RequestRejectedException : URL이 정규화되지 않았기 때문에 요청이 거부되었습니다.

  • localhost:8080/.. 잘못된 요청

내장 된 바람둥이가 그 반응을 제공하는 것 같습니다. 전역 오류 컨트롤러를 추가하려고 시도했는데 봄에 오류가 발생할 수 있습니다.

  • localhost:8080/... 끝점을 찾을 수 없습니다.

이러한 끝점 "/ ..."에 대한 매핑이 없기 때문에 이것은 예외입니다.

나는 당신의 브라우저가 실제로 대한 요청하고 있다고 생각 localhost:8080/당신이 입력 할 때 localhost:8080/.또는 localhost:8080/..귀하의 봄 부팅 응용 프로그램은 리디렉션되지 않는다

65967210
반응형