Клиент отправляет токен SHA1, действительный до 24 часов, необходимо авторизовать этот токен SHA1 с помощью Spring Boot.
Пример: 1-й сервис отправляет запрос на 2-й сервис, передавая токен SHA1 (действительный 24 часа)как часть заголовка / параметра запроса.Поэтому 2-й сервис должен авторизовать этот токен SHA1 с помощью Spring Boot.
Я пробовал с подходом Filter.Помогите фрагмент кода, если любой новый подход тоже хорошо.
Пожалуйста, обратитесь ниже код.
TokenAuthConfig.java file
package com.scheduler.config;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import com.scheduler.filter.config.TokenAuthFilter;
import lombok.extern.slf4j.Slf4j;
@Configuration
@EnableWebSecurity
@Order(1)
@Slf4j
public class TokenAuthConfig extends WebSecurityConfigurerAdapter {
@Value("${report.rest.key.secret_key}")
private String SECRET_KEY;
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
TokenAuthFilter filter = new TokenAuthFilter("Authorization");
filter.setAuthenticationManager(new AuthenticationManager() {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
log.info("TokenAuthConfig.configure.AuthenticationManager.authenticate SECRET_KEY: " + SECRET_KEY);
String principal = (String) authentication.getPrincipal();
if (!generateSHA1Token().equals(principal)) {
throw new BadCredentialsException("The key was not found or not the expected value.");
}
authentication.setAuthenticated(true);
return authentication;
}
});
httpSecurity.antMatcher("/schedule/v1/status/learner/getAllLearnersReport").csrf().disable().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().addFilter(filter).authorizeRequests()
.anyRequest().authenticated();
}
private String generateSHA1Token() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
String utcStringDate = simpleDateFormat.format(new java.util.Date());
String sha1Token = DigestUtils.sha1Hex((SECRET_KEY + utcStringDate));
log.info("SHA1Token: "+ sha1Token);
return sha1Token;
}
}
TokenAuthFilter.java file
package com.scheduler.filter.config;
import javax.servlet.http.HttpServletRequest;
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TokenAuthFilter extends AbstractPreAuthenticatedProcessingFilter{
public String principalRequestHeaderKey;
public TokenAuthFilter(String principalRequestHeaderKey) {
log.info("TokenAuthFilter.getPreAuthenticatedPrincipal executed");
this.principalRequestHeaderKey = principalRequestHeaderKey;
}
@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
log.info("TokenAuthFilter.getPreAuthenticatedPrincipal executed");
return request.getHeader("token");
}
@Override
protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {
return "N/A";
}
}