保誠-保戶業務員媒合平台
pamapi/src/main/java/com/pollex/pam/service/CustomerAuthService.java
@@ -1,34 +1,67 @@
package com.pollex.pam.service;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.pollex.pam.domain.Customer;
import com.pollex.pam.enums.CustomerDetailEnum;
import com.pollex.pam.repository.CustomerRepository;
import com.pollex.pam.security.jwt.TokenProvider;
import com.pollex.pam.security.token.OtpAuthenticationToken;
import com.pollex.pam.web.rest.vm.OtpAccount;
@Service
@Transactional
public class CustomerAuthService {
   @Autowired
    AuthenticationManagerBuilder authenticationManagerBuilder;
   @Autowired
    CustomerRepository customerRepository;
    @Autowired
    TokenProvider tokenProvider;
   public String authorize(String account, String indexKey, String otpCode) {
      OtpAccount otpAccount = new OtpAccount(account, indexKey);
   public String authorize(Customer account, String indexKey, String otpCode) {
      OtpAccount otpAccount = OtpAccount.createOtpAccount(account, indexKey);
        OtpAuthenticationToken authenticationToken = new OtpAuthenticationToken(
            otpAccount,
            otpCode
        );
        Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
        SecurityContextHolder.getContext().setAuthentication(authenticationToken);
        Authentication authentication = buildCustomerAuthToken(account, otpCode, indexKey);
        String jwt = tokenProvider.createToken(authentication, false);
        return jwt;
   }
   public UsernamePasswordAuthenticationToken buildCustomerAuthToken(Customer customer
          , String otpCode, String indexKey) {
        List<GrantedAuthority> grantedAuths = Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"));
        final String account = customer.toAccountString();
        UsernamePasswordAuthenticationToken authenticationToken =
              new UsernamePasswordAuthenticationToken(account, otpCode, grantedAuths);
        Map<String, String> details = new HashMap<>();
        details.put(CustomerDetailEnum.DB_ID.getValue(), customer.getId().toString());
        authenticationToken.setDetails(details);
        return authenticationToken;
    }
}