2015-07-29 1 views
6

Я хочу настроить значение Authorize Requests из базы данных при запуске сервера. В настоящее время я даю основную ценность в файле класса Java, есть ли способ прочитать то же самое из базы данных.Spring security Authorize Запросить значение из базы данных

Ниже приведен пример кода:

protected void configure(HttpSecurity http) throws Exception { 
http 
    .authorizeRequests()                 
     .antMatchers("/resources/**", "/signup", "/about").permitAll()     
     .antMatchers("/admin/**").hasRole("ADMIN")          
     .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")    
     .anyRequest().authenticated()             
     .and() 
    // ... 
    .formLogin(); 
} 

Как читать URL из базы данных для например: администратор/** из базы данных вместо жесткого значения кода в файлах классов

+0

и каков будет желаемый результат, если база данных недоступна? – hovanessyan

ответ

3

Вы можете использовать поддержку/Spring JDBC , Прежде всего вам нужно настроить базу данных. Затем вы можете получить строки и обработать их соответствующим образом.

У вас должен быть стол, в котором у вас есть строки, а столбец заполнен как /admin/** и /db/**. В другой колонке должна быть заполнена информация о ролевом доступе. После этого, следуя руководству, вы должны получить эти строки. Давайте предположим, что вы следующий класс объектов:

class Matcher { 
    public String name; 
    public String roleInfo; 
} 

Затем, вы можете перебрать Matcher лиц для конфигурации:

http.authorizeRequests() 
      .antMatchers("/resources/**", "/signup", "/about").permitAll(); 

    for (Matcher matcher : matchers) { 
     http.authorizeRequests().antMatchers(matcher.name).access(matcher.roleInfo); 
    } 
    http.authorizeRequests().anyRequest().authenticated() 
      .and() 
        // ... 
      .formLogin(); 
+0

У меня уже есть настройка базы данных. Как я могу присвоить значение antMatchers из базы данных вместо жесткого кода в классе. Если мне что-то не хватает, скажите, пожалуйста, какую настройку базы данных вы хотите мне сделать. – pise

+0

@pise Я обновил ответ. – mtyurt

+0

Так что, пока сервер запускается, мне нужно прочитать значение базы данных, а затем итерацию? – pise

0

У меня была такая же проблема. В моем случае для роли у меня назначено несколько маршрутов. Кому-то это может понадобиться. Следует отметить, что я беру в качестве ссылки ответ @mtyurt. Путем я решил это было следующим образом:

List<Role> roles = roleRepository.findAll(); 
for (Role role : roles 
     ) { 
    List<Page> pages = pageRepository.findPagesPerRole(role.getId()); 
    List<String> pageslist = new ArrayList<>(); 
    for (Page page : pages 
     ) { 
     pageslist.add(page.getUrl()); 
    } 
    String[] authorities = pageslist.toArray(new String[0]); 
    http.authorizeRequests().antMatchers(authorities).hasAuthority(role.getAuthority().toString()); 
} 

У меня есть table где я держать маршруты и другое, где я держать roles. В ролях я могу назначить вам страницы, а страница может быть в нескольких ролях, поэтому создается таблица many-to-many. Из SQL я получил список маршрутов, назначенных роли. Вот почему я делаю два цикла. Затем, наконец, к http я назначаю массив strings и имя роли.

Смежные вопросы