Я создаю Github-подобный API. Существует 2 основных понятия: пользователь и репо. Пользователь участвует во многих репо, и в каждом репо участвует много пользователей. Другими словами, пользователи и репозитории имеют отношение «многие ко многим».
Ниже представлены упрощенные модели данных:
User
- Id
- ...
Repo
- Id
- ...
Membership
- UserId
- RepoId
- Role (Admin, Write, Read)
Конечные точки:
- / viewPR/: prId (требуется чтение роли)
- / ApprovePR /: prId (требуется запись роли)
- / mergePR /: prId (требуется роль администратора)
(userId и repoId не являются частью маршрута, но, скажем, клиент каким-то образом передаст userId и repoId в запросе API, возможно, в теле запроса, и я также согласен с тем, чтобы поместить их в uri запроса, например /userId/repoId/viewPR/:prId
).
Я хочу использовать защищенные конечные точки Spring Security от несанкционированных запросов. Пример Spring Security + REST API, на котором я учусь (см. пример ):
@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
// Create 2 users for demo
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("{noop}password").roles("USER")
.and()
.withUser("admin").password("{noop}password").roles("USER", "ADMIN");
}
// Secure the endpoins with HTTP Basic authentication
@Override
protected void configure(HttpSecurity http) throws Exception {
http
//HTTP Basic authentication
.httpBasic()
.and()
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/books/**").hasRole("USER")
.antMatchers(HttpMethod.POST, "/books").hasRole("ADMIN")
.antMatchers(HttpMethod.PUT, "/books/**").hasRole("ADMIN")
.antMatchers(HttpMethod.PATCH, "/books/**").hasRole("ADMIN")
.antMatchers(HttpMethod.DELETE, "/books/**").hasRole("ADMIN")
.and()
.csrf().disable()
.formLogin().disable();
}
}
Для protected void configure(HttpSecurity http)
части, которую я хочу сделать:
// Secure the endpoins with HTTP Basic authentication
@Override
protected void configure(HttpSecurity http) throws Exception {
http
//HTTP Basic authentication
.httpBasic()
.and()
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/viewPR/**").hasRole("Read")
.antMatchers(HttpMethod.POST, "/approvePR/**").hasRole("Write")
.antMatchers(HttpMethod.POST, "/mergePR/**").hasRole("Admin")
.and()
.csrf().disable()
.formLogin().disable();
}
}
Но не знаете, как сделать в protected void configure(AuthenticationManagerBuilder auth)
части так, чтобы она запрашивала у таблицы БД Membership
свою роль, заданную userId и repoId? Может быть, мне нужна аутентификация JDBC , но я не уверен, как ее использовать здесь, поскольку она более сложна, чем шаблон пароля пользователя, как показано в примере.
Спасибо за помощь:)