"HttpSecurity" URL 패턴은 올바르게 정렬되어있어야 합니다.

 

HttpSecurity.authorizeRequests() 메소드로 설정된 URL 패턴은 선언된 순서로 고려됩니다.
이것은 더 세부적으로 구성된 설정 앞에 덜 세부적으로 구성된 설정을 선언하는 실수를 하기 쉽게 합니다.
그러므로, “antMatcher” 선언의 순서를 확인할 필요가 있습니다.
“/**” 이 선언된 경우, 이 설정은 마지막에 선언되어야 합니다.

이 규칙은 다음과 같은 상황에서 문제를 제기합니다.

  • 패턴 앞에 **로 끝나는 패턴이 있고 시작이 동일한 경우
    • 예 : “/page-admin/db/**“가 “/page-admin/*” 뒤에 있는 경우
  • 와일드카드 문자가 없는 패턴 앞에 일치하는 다른 패턴이 나옵니다.
    • 예 : “/page-index/db”가 “/page/” 뒤에 있는 경우

규칙을 어긴 코드

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/resources/**", "/signup", "/about").permitAll() // 규칙을 준수한 코드
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/admin/login").permitAll() // 규칙을 어긴 코드; 패턴 "/admin/login" 은 패턴 "/admin/**" 앞에 위치해야 합니다.
        .antMatchers("/**", "/home").permitAll()
        .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") // 규칙을 어긴 코드; 패턴 "/db/**" 패턴 "/**" 앞에 위치해야 합니다.
        .and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();
}

규칙을 준수한 해결책

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/resources/**", "/signup", "/about").permitAll() // 규칙을 준수한 코드
        .antMatchers("/admin/login").permitAll()
        .antMatchers("/admin/**").hasRole("ADMIN") // 규칙을 준수한 코드
        .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
        .antMatchers("/**", "/home").permitAll() // 규칙을 준수한 코드; "/**" 이 마지막 입니다.
        .and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();
}

참고


If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project