Шлюз Zuul не разрешает страницу аутентификации входа - PullRequest
0 голосов
/ 01 августа 2020

Я создаю веб-приложение весенней загрузки и для этого приложения маршрутизирую свой клиентский запрос через службу zuul gatway.

Я пытаюсь выполнить аутентификацию в самой службе Zuul gatway. Но мой URL конечной точки входа не маршрутизируется должным образом.

Пожалуйста, найдите мой код ниже.

пожалуйста, найдите мой WebSecurityConfig файл

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtTokenProvider jwtTokenProvider;

    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //Cross-origin-resource-sharing: localhost:8080, localhost:4200, 3000(allow for it.)
        http.cors().and()
                .authorizeRequests()
                //These are public pages.
                .antMatchers("/resources/**", "/error", "/service/**", "/api/**", "**/login").permitAll()
                //These can be reachable for just have trainee role.
                .antMatchers("/service/trainee/**").hasRole("TRAINEE")
                //These can be reachable for just have mentor role.
                .antMatchers("/service/mentor/").hasRole("MENTOR")
                //These can be reachable for just have admin role.
                .antMatchers("/service/admin").hasRole("ADMIN")
                //All remaining paths should need authentication.
                .anyRequest().fullyAuthenticated()
                .and()
                .logout().permitAll()
                .logoutRequestMatcher(new AntPathRequestMatcher("/service/user/logout", "POST"))
                .and()
                //login form and path.
                .formLogin().loginPage("/api/service/user/login").and()
                //Enable basic authenticatio http header "basic: usernmae:password"
                .httpBasic().and()
                //Cross side request forgery.
                .csrf().disable();

        //jwt filter
        http.addFilter(new JwtAuthorizationFilter(authenticationManager(), jwtTokenProvider));

    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());

    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("*").allowedMethods("*");
            }
        };
    }

}

Пожалуйста, найдите мой UserController file

@RestController
public class UserController {

    @Autowired
    private JwtTokenProvider tokenProvider;

    @Autowired
    private UserService userService;


    private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);


    @GetMapping("/api/service/user/login")
    public ResponseEntity<?> getUser(Principal principal){
        if(principal == null ) {
            //This should be ok http status because here will be logout path.
            //assert principal != null;
            System.out.println("Login user principal null from Zuul gateway....");
            return ResponseEntity.ok(principal);
        }
        UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) principal;
        LOGGER.info("Login user from Zuul gateway....");
        System.out.println("Login user from Zuul gateway....");
        User user = userService.findByUsername(authenticationToken.getName());
        LOGGER.info("Logged User : {}",user.getName());
        user.setToken(tokenProvider.generateToken(authenticationToken));
        return new ResponseEntity<>(user, HttpStatus.OK);

    }
}

Я написал два sysout в методе getUser(), ни один из sysout не печатает.

Найдите URL-адрес конечной точки, который я использую в моем клиенте (Angular ) app

let LOGIN_API_URL = "http://localhost:8765/api/service/user/login"

Я протестировал этот URL-адрес конечной точки в почтальоне, и он работает.

Найдите файл свойств моего приложения

spring.application.name=gateway-service
server.port=8765

#datasource
spring.datasource.url=jdbc:mysql://localhost:3306/moddbnew?useUnicode=true&useLegacyDatetimeCode=false&serverTimezone=UTC&createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&userSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#spring.main.web-application-type=none

spring.jpa.hibernate.ddl-auto=none

#liquibase
spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.xml

#jwt
app.jwt.secret=RandomSecretKey
#1 day
app.jwt.expiration-in-ms=86400000
app.jwt.token.prefix=Bearer
app.jwt.header.string=Authorization


zuul.ignored-headers=Access-Control-Allow-Credentials, Access-Control-Allow-Origin

zuul.sensitiveHeaders=Cookie, Set-Cookie

zuul.prefix=/api
zuul.routes.user.path=/user/**
zuul.routes.user.serviceId=core-services


zuul.prefix=/service/**
zuul.routes.service.path:/user/**
zuul.routes.service.url:http://localhost:8765/api/service/user/login



eureka.client.service-url.default-zone=http://localhost:8761/eureka/
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90

ribbon.eureka.enabled=true

zuul.ribbon.eager-load.enabled=true

ribbon.ReadTimeout=60000

ribbon.ConnectTimeout=10000

spring.main.allow-bean-definition-overriding=true
...