Я настраиваю архитектуру, которая заключается в использовании микросервиса с аутентификацией 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);
}
}
Что я должен сделать, чтобы перенаправление работало?Спасибо за вашу помощь