Как использовать Zuul для изменения местоположения после аутентификации (с пружинной защитой) - PullRequest
0 голосов
/ 05 апреля 2019

Я настраиваю архитектуру, которая заключается в использовании микросервиса с аутентификацией oauth2.У меня есть два типа пользователей: первый - простой пользователь, а второй - администратор.Моя проблема заключается в том, что два пользователя зарегистрированы в одной и той же службе аутентификации, но они должны быть перенаправлены в разную веб-службу (stpo-admin-service & stpo-service)

Я нашел способ сделать это сzuul, поместив нужные свойства в application.yml, но это не сработало.Я что-то забыл?

Вот мой метод SecurityConfig

@Override
    protected void configure(HttpSecurity http) throws Exception { 
http.requestMatchers()
                .antMatchers("/login", "/oauth/authorize")
                .and()
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and().exceptionHandling()
                .authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login"))
                .and()
                .formLogin()
                .permitAll()
                .loginPage("/login")
                .successHandler(myAuthenticationSuccessHandler)
                .and()
                .logout()
                .logoutSuccessUrl("/login")
                .and()
               .csrf().disable();
}

Я также создал класс для обработки успешной аутентификации:


@Component("myAuthenticationSuccessHandler")
public class MySimpleUrlAuthenticationSuccessHandler  implements AuthenticationSuccessHandler {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();



    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        handle(request, response, authentication);

        final HttpSession session = request.getSession(false);
        if (session != null) {
            session.setMaxInactiveInterval(30 * 60);
          //  LoggedUser user = new LoggedUser(authentication.getName(), activeUserStore);
            session.setAttribute("user", authentication.getName());
        }
        clearAuthenticationAttributes(request);
    }

    protected void handle(final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication) throws IOException {
        final String url = determineTargetUrl(authentication);

        if (response.isCommitted()) {
            logger.debug("Response has already been committed. Unable to redirect to " + url);
            return;
        }
        redirectStrategy.sendRedirect(request, response, url);
    }


    protected String determineTargetUrl(final Authentication authentication) {
        StpoUser user = (StpoUser) authentication.getPrincipal();

        Role role = user.getUser().getRole();

        switch (role.getName()){
            case "ROLE_ADMIN":
            case "SUPER_ADMIN":
                return /stpo-admin/";
            case "ROLE_USER":
            case "ROLE_MAIN_USER":
                return "/stpo/";

        }

        return null;
    }

Вот мой Application.yml:

server:
  port: 8090
  servlet:
    context-path: /auth

eureka:
  instance:
    # enable to register multiple app instances with a random server port
    instance-id: ${spring.application.name}:${random.uuid}

zuul:
  routes:
    stpo:
      path: /auth/stpo/**
      url: http://localhost:8082/stpo/
      sensitive-headers: Set-Cookie,Authorization
    stpo-admin:
      path: /auth/stpo-admin/**
      sensitive-headers: Set-Cookie,Authorization
      url: http://localhost:8083/stpo-admin/

Основной класс:

@SpringBootApplication
@EnableResourceServer
@EnableFeignClients
@EnableZuulProxy
public class Stpo3AuthenticationService extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Stpo3AuthenticationService.class, args);
    }


}

Что я должен сделать, чтобы перенаправление работало?Спасибо за вашу помощь

...