Пример регистрации и авторизации в микросервисной архитектуре Java Spring

Задача заключается в реализации полноценного проекта в микросервисной архитектуре с авторизацией и регистрацией (Java, Spring, PostgreSQL)

Представим, к примеру, что это социальная сеть.

Пользователь должен иметь возможность проходить регистрацию и авторизацию в системе. У пользователя, соответственно, есть присущие ему объекты, поэтому API должен каким-то образом понимать, в контексте какого юзера возвращать данные.

Понятно, что некоторый авторизационный сервис должен генерировать JWT и возвращать в куки клиенту, чтобы с этим токеном он имел возможность ходить по ручкам.

Но сам функционал авторизации выглядит как шаблонная задача, которая не сильно различается в проектах и хотелось бы увидеть полноценный пример (код) такой реализации с взаимодействием с базой данных, вместо попыток изобретения велосипеда

Возможно я ошибаюсь и мне нужно совсем другое, так как практически нигде не вижу реализацию регистрации в Spring. Но для меня это странно. Как юзер сможет авторизоваться, если он не зарегистрирован?


Ответы (1 шт):

Автор решения: TaranenkoAnt

Если Вам нужен шаблонный код, то он может выглядеть следующим образом:

public interface UserService {
    User register(User user);
    String login(String username, String password);
}


@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public User register(User user) {
        // Логика регистрации пользователя
    }

    @Override
    public String login(String username, String password) {
        // Логика аутентификации и генерации JWT
    }
}

Контроллер:

@RestController
public class AuthController {

    @Autowired
    private UserService userService;

    @PostMapping("/register")
    public User register(@RequestBody User user) {
        return userService.register(user);
    }

    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password) {
        return userService.login(username, password);
    }

}

Теперь нужно настроить Security и jwt-фильтр:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .addFilterBefore(new JwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
    }
}

public class JwtTokenFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // Логика проверки JWT и аутентификации
    }
}

Остальное зависит от Вашей конкретной задачи.

→ Ссылка