관리자 페이지에 로그인 해야 하는데 관리자가 아니시네요?
스프링 부트를 사용하여 진행되는 거의 모든 프로젝트에서는 로그인 및 권한 관리 툴로써 Spring Security
를 사용할 것이다. 본인도 마찬가지로 스프링 시큐리티를 사용하며 중복되는 url 패턴의 우선순위 작업 도중 버그를 만나게 되었는데, 그 우선순위에 대한 이야기를 하려고 한다.
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
http
.authorizeRequest()
.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
...}
--------------------------------------------------------------------------------------------------
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/admin/login").permitAll()
...}
위의 사항에서 /admin/~~~
뒤로 오는 모든 사이트는 Admin
역할을 가진 관리자만 접근할 수 있으면서, /admin/login
이라는 로그인은 모두가 접근할 수 있게 함으로써 관리자가 접근하여 로그인 할 수 있게 설계를 할려면,
즉 /admin
으로 들어오는 url 패턴은 모두 관리자를 위한 페이지를 제공하면서 관리자가 로그인을 하는 시점에는 모두가 접근할 수 있어야 하므로 /admin/login
은 모든 사람이 접근할 수 있게 설계를 하려면!
위의 예시에서 위 코드가 맞을까, 아래 코드가 맞을까?
결론적으로는 위 코드 가 맞다. 우선순위는 역할을 부여하는 것으로 결정되는 것이 아닌, 바로 url 패턴으로 결정되는 것이었는데, url 패턴이 좀 더 세부적일 수록(/admin/login
) 위쪽으로 먼저 작성하고, 좀 더 브로드 할수록(/admin/**
)아래쪽으로 설정해줘야 정상작동한다고 한다.
라이브러리를 파헤쳐보다가 포기하였지만... 처음 든 예상으로는 어댑터 성능상 위쪽부터 파싱해가면서 세부적인 로직에 먼저 접근하여 권한부여가 끝나면 아래쪽에서 break가 걸리지 않을까 라는 예상이 된다. 내가 어댑터를 만들더라도 한 어레이를 순회중에 원하는 아이템을 발견하면 거기서 멈추도록 프로그램을 만들었을 것이기 때문이다.
자세한 로직은 더 공부를 하고 라이브러리를 헤쳐본 다음에 재포스팅 하도록 하겠다..
*참고자료
1. https://www.baeldung.com/spring-security-expressions
2. https://stackoverflow.com/questions/30819337/multiple-antmatchers-in-spring-security
감사합니다 미래의 제가 도움을 받았습니다.