У меня есть приложение на основе Spring Boot. Я хочу, чтобы URL-адрес /camunda/app/welcome/default/#!/login
был доступен без какой-либо аутентификации, а URL-адреса
/camunda/app/welcome/default/#!/welcome
,/camunda/app/welcome/default/#!/dashboard
,/camunda/app/tasklist/**
и/camunda/app/admin/**
должны быть защищены (т. е. только аутентифицированные пользователи должны иметь к ним доступ).
Для этого я написал следующую конфигурацию:
@Configuration
@EnableWebSecurity
public class MyConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.requestMatchers()
.and()
.authorizeRequests()
.antMatchers("/camunda/app/welcome/default/#!/login").permitAll()
.antMatchers("/camunda/app/welcome/default/#!/welcome",
"/camunda/app/welcome/default/#!/dashboard",
"/camunda/app/tasklist/**",
"/camunda/app/admin/**",
"/oauth2/authorization/**",
"/oauth2/code/myredirecturl")
.authenticated()
.and()
.oauth2Login(...)
.logout()
.logoutRequestMatcher(...)
.logoutSuccessHandler(...);
}
}
Однако с этой конфигурацией неавторизованные пользователи могут получить доступ к URL-адресам, которые должны быть защищены (/camunda/app/welcome/default/#!/welcome
, /camunda/app/welcome/default/#!/dashboard
, /camunda/app/tasklist/**
, /camunda/app/admin/**
).
Что не так с моей конфигурацией и как я могу это исправить?
Убедитесь, что вы используете кодировку URL #
, которая является %23
при вызове конечных точек. В противном случае символы после #
не будут учитываться.
Отправка запроса к /camunda/app/welcome/default/#!/welcome
без надлежащего кодирования будет интерпретироваться как запрос к /camunda/app/welcome/default/
. Поскольку эта конечная точка не требует аутентификации, доступ к ней будет разрешен любому.
Поскольку все конечные точки, кроме /camunda/app/welcome/default/#!/login
, требуют аутентификации, вы сжимаете свою конфигурацию HttpSecurity
. Я перепишу его ниже, используя конфигурацию лямбда-стиля, чтобы сделать его более читабельным:
http
// no need to add requestMatchers since you aren't changing the default configuration
.authorizeRequests(authz -> authz
.antMatchers("/camunda/app/welcome/default/#!/login").permitAll()
.anyRequest().authenticated() // any request that does not match the above rule ^ will require an authenticated user
)
.oauth2Login(...)
.logout(...)
К сожалению, это не сработает, потому что на самом деле есть только один URL:
/камунда/приложение/добро пожаловать/по умолчанию/
и части после символа «#» называются «якорями»:
#!/добро пожаловать, #!/панель приборов,
Анкоры не обрабатываются на бэкенде, потому что они указывают на какое-то место в html-документе, который был загружен на стороне клиента.
Таким образом, вы не можете решить это только с помощью Spring, должна быть какая-то логика внешнего интерфейса.
Также эти две маски:
/camunda/приложение/список задач/, и /камунда/приложение/админ/
может быть покрыт Spring Boot, потому что указывает на разные URL-адреса, а не на якоря.