API защиты REST на основе отношения «многие ко многим» с использованием Spring Security - PullRequest
0 голосов
/ 04 октября 2019

Я создаю 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 , но я не уверен, как ее использовать здесь, поскольку она более сложна, чем шаблон пароля пользователя, как показано в примере.

Спасибо за помощь:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...