Как авторизовать / аутентифицировать токен SHA1 с помощью Spring Boot (только на одной конечной точке)? - PullRequest
0 голосов
/ 13 мая 2019

Клиент отправляет токен 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";
    }

}
...