создайте базовое защищенное приложение с пружиной в чистой настройке архитектуры - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь привыкнуть к чистой архитектуре, и там я начал проект, основанный на этом: 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но я понятия не имею, что?Если у вас есть идеи, поделитесь ими со мной.

Спасибо за помощь!

...