package com.mzl.flower.config.security.handler;
|
|
import cn.hutool.core.map.MapUtil;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.mzl.flower.base.R;
|
import com.mzl.flower.base.ReturnDataDTO;
|
import com.mzl.flower.config.security.AuthUtils;
|
import lombok.Builder;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.http.HttpHeaders;
|
import org.springframework.security.authentication.BadCredentialsException;
|
import org.springframework.security.core.Authentication;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.security.oauth2.common.OAuth2AccessToken;
|
import org.springframework.security.oauth2.common.exceptions.InvalidClientException;
|
import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException;
|
import org.springframework.security.oauth2.provider.*;
|
import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
|
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
|
@Slf4j
|
@Builder
|
public class SelfAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
|
|
private static final String BASIC_ = "Basic ";
|
|
private PasswordEncoder passwordEncoder;
|
private ObjectMapper objectMapper;
|
private ClientDetailsService clientDetailsService;
|
private AuthorizationServerTokenServices authorizationServerTokenServices;
|
|
@Override
|
public void onAuthenticationSuccess(HttpServletRequest request,
|
HttpServletResponse response,
|
Authentication authentication) {
|
String header = request.getHeader(HttpHeaders.AUTHORIZATION);
|
|
if (header == null || !header.startsWith(BASIC_)) {
|
throw new UnapprovedClientAuthenticationException("请求头中无client信息");
|
}
|
|
try {
|
String[] tokens = AuthUtils.extractAndDecodeHeader(header);
|
assert tokens.length == 2;
|
String clientId = tokens[0];
|
String clientSecret = tokens[1];
|
|
ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);
|
|
//校验secret
|
if (!passwordEncoder.matches(clientSecret, clientDetails.getClientSecret())) {
|
throw new InvalidClientException("Given client ID does not match authenticated client");
|
}
|
|
TokenRequest tokenRequest = new TokenRequest(MapUtil.newHashMap(), clientId, clientDetails.getScope(), "password");
|
|
OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails);
|
|
OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication);
|
|
OAuth2AccessToken token = authorizationServerTokenServices.createAccessToken(oAuth2Authentication);
|
response.setContentType("application/json;charset=UTF-8");
|
ReturnDataDTO resultDTO = new ReturnDataDTO(R.SUCCESS.getCode(), token, "success");
|
response.getWriter().write(objectMapper.writeValueAsString(resultDTO));
|
} catch (IOException e) {
|
throw new BadCredentialsException(
|
"Failed to decode basic authentication token");
|
} catch (Exception e) {
|
throw new BadCredentialsException(e.getMessage());
|
}
|
|
}
|
|
|
}
|