Я занимаюсь разработкой веб-приложений с использованием Spring и Hibernate.Требуется реализовать авторизацию на основе ролей с использованием безопасности на уровне метода.
Мое приложение разделено на две части -
- API входа -Login API в основном предоставляет имя пользователя/ пароль аутентификации с использованием базы данных и будет генерировать токен.
- Основной API - Этот API отвечает за все остальные функции.
Первый и последний (вход в систему/ logout) запрос от клиента будет обработан через login-api, а остальная часть запроса будет отправлена в main-api.Для проверки подлинности запроса в main-api у меня есть перехватчик в main-api, который в конечном итоге вызовет метод login-api для проверки подлинности запроса.Таким образом, в main-api аутентификация выполняется через login-api, однако я хочу авторизовать каждый запрос в main-api на основе пользовательских ролей, определенных в базе данных.
Ниже приведен мой пример контроллера в main-api
@RestController
public class HealthController {
@PreAuthorize("hasRole('ADMIN')")
@RequestMapping(path = "/health", method = {RequestMethod.GET, RequestMethod.POST})
public ResponseEntity<String> getHealth() {
System.out.println("HealthController");
return new ResponseEntity<String>("Hello User!", HttpStatus.OK);
}
}
Я действительно не знаю, как определить пользовательские роли и авторизовать запрос на его основе.
Ниже приведен пример класса WebSecurityConfiguration, который я нашел в Google.Я вижу, что имя пользователя / пароль и роли жестко запрограммированы здесь.В моем случае у меня есть userId, и на основании этого я должен выбрать роли из базы данных и проверить авторизацию.
Я надеюсь, что то, что я просил, возможно.
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("greg").password("turnquist").roles("ADMIN").and()
.withUser("ollie").password("gierke").roles("USER", "ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic().and()
.authorizeRequests()
.antMatchers("/health").hasRole("ADMIN")
.antMatchers("/employees/**").hasRole("ADMIN")
.antMatchers("/employees/**").hasRole("ADMIN").and()
.csrf().disable();
}
}