Я создаю веб-приложение весенней загрузки и для этого приложения маршрутизирую свой клиентский запрос через службу 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