Я пытаюсь привыкнуть к чистой архитектуре, и там я начал проект, основанный на этом: git clean-architect-example
К сожалению, этот проект не описанкак работать с пользователями, которые должны войти в систему, чтобы использовать остальные вызовы, и я вроде как потерял, как это сделать.Позвольте мне объяснить, что я пытался получить:
- Я добавил объект пользователя POJO в ядре проекта и таблицу для него.
- добавил зависимость "org.springframework.boot: spring-boot-starter-security" к ext.libs -> spring_boot в build.gradle главной папки
- Чтобы оставаться в порядкес чистой архитектурой я думаю, что мне нужно добавить сценарий использования, который проверяет пользователя, поэтому я создал один
- , добавил UserUseCase в основной проект, который включает метод для получения имени пользователя + пароль и использование DataProvider для получениясопоставить его с базой данных, возвращает объект пользователя или null
- добавил класс в конфигурации проекта с именем WebSecurityConfig, который расширяет WebSecurityConfigurerAdapter (там я не знаю, как соединить все вместе)
- создал вызов rest, которому нужен пользователь
Прежде всего, классы, которые я получил до сих пор:
Сущность пользователя в ядре проекта
public User{
private String name;
private String role;
//and more
//+ basic methods like getter and setter
}
Вариант использованиясоздавать, удалять и проверять пользователя, также в основном проекте.Этот класс создается как bean-компонент в проекте конфигурации
public class UserUseCase {
private UserProvider _userProvider;
public UserUseCase(UserProvider userProvider) {
_userProvider = userProvider;
}
public User getUser(String name, String password) {
Optional<User> verifyLogin = _userProvider.verifyLogin(name, password);
if (verifyLogin.isPresent()) {
return verifyLogin.get();
}
return null; //or throw exception doesn't know yet
}
}
Поставщик данных, чтобы пользователь мог входить и выходить из базы данных, также в основном проекте.Он реализован как другие провайдеры в примере проекта, в проекте dataproviders.
public interface UserProvider {
public abstract Optional<User> verifyLogin(String name, String password);
public abstract void registerUser(String name, String password);
public abstract void deleteUser(String name);
}
WebSecurityConfig в проекте конфигурации, где, я думаю, он будет соединен вместе?
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/", "/home")
.permitAll()
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginPage("/login") //do i need a login page (html) or will a rest controller do?
.permitAll()
.and()
.logout()
.permitAll();
}
//what method do i have to override in order to match what the restcall is getting with the user in the database?
}
Как дозу получит контроллер покоя пользователю?я видел много способов с контекстом безопасности, @Context или другими, но я думаю, что использовать является частью WebSecurityConfig выше?
@RestController
public class MyRestController {
private MyUseCase _MyUseCase;
public MyRestController(MyUseCase MyUseCase) {
_MyUseCase = MyUseCase;
}
@RequestMapping(value = "path/do/stuff", method = GET, consumes = MediaType.APPLICATION_JSON)
public CustomeObjectDTO getThingsAsUser(@RequestBody RequestDTO requestDTO, Principal principal) {
//do i need Principal or a annotation?
//how dose that look like
//lets call it some magic to get the User and use that in usecases like so
return CustomeObjectDTO.from(_MyUseCase.getStuff(requestDTO.toInternalEntity(), user));
}
}
Я действительно думаю, что мне нужно связать сценарий использования с чем-то в WebSecurityConfigно я понятия не имею, что?Если у вас есть идеи, поделитесь ими со мной.
Спасибо за помощь!