|
|
|
@ -0,0 +1,154 @@
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
* Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* https://www.gz-yami.com/
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 未经允许,不可做商业用途!
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* 版权所有,侵权必究!
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
package com.yami.shop.api.security;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import cn.binarywang.wx.miniapp.api.WxMaService;
|
|
|
|
|
|
|
|
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
|
|
|
|
|
|
|
|
import cn.hutool.core.util.BooleanUtil;
|
|
|
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
|
|
|
import cn.hutool.extra.servlet.ServletUtil;
|
|
|
|
|
|
|
|
import com.yami.shop.common.util.Json;
|
|
|
|
|
|
|
|
import com.yami.shop.common.util.RedisUtil;
|
|
|
|
|
|
|
|
import com.yami.shop.security.constants.SecurityConstants;
|
|
|
|
|
|
|
|
import com.yami.shop.security.enums.App;
|
|
|
|
|
|
|
|
import com.yami.shop.security.exception.BadCredentialsExceptionBase;
|
|
|
|
|
|
|
|
import com.yami.shop.security.exception.ImageCodeNotMatchExceptionBase;
|
|
|
|
|
|
|
|
import com.yami.shop.security.exception.UsernameNotFoundExceptionBase;
|
|
|
|
|
|
|
|
import com.yami.shop.security.exception.WxErrorExceptionBase;
|
|
|
|
|
|
|
|
import com.yami.shop.security.model.AppConnect;
|
|
|
|
|
|
|
|
import com.yami.shop.security.service.YamiUser;
|
|
|
|
|
|
|
|
import com.yami.shop.security.service.YamiUserDetailsService;
|
|
|
|
|
|
|
|
import com.yami.shop.security.token.MyAuthenticationToken;
|
|
|
|
|
|
|
|
import lombok.AllArgsConstructor;
|
|
|
|
|
|
|
|
import me.chanjar.weixin.common.error.WxErrorException;
|
|
|
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
|
|
|
import org.springframework.security.authentication.AuthenticationManager;
|
|
|
|
|
|
|
|
import org.springframework.security.authentication.AuthenticationServiceException;
|
|
|
|
|
|
|
|
import org.springframework.security.core.Authentication;
|
|
|
|
|
|
|
|
import org.springframework.security.core.AuthenticationException;
|
|
|
|
|
|
|
|
import org.springframework.security.core.userdetails.UserDetails;
|
|
|
|
|
|
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
|
|
|
|
|
|
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
|
|
|
|
|
|
|
|
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
|
|
|
|
|
|
|
|
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
|
|
|
|
|
|
|
|
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
|
|
|
|
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import javax.servlet.ServletInputStream;
|
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 小程序登陆:此时principal为code
|
|
|
|
|
|
|
|
* post:http://127.0.0.1:8086/login
|
|
|
|
|
|
|
|
* {principal:code}
|
|
|
|
|
|
|
|
* 管理员登陆:
|
|
|
|
|
|
|
|
* post: http://127.0.0.1:8086/login
|
|
|
|
|
|
|
|
* {principal:username,credentials:password}
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
@Component
|
|
|
|
|
|
|
|
public class LoginAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final YamiUserDetailsService yamiUserDetailsService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final WxMaService wxMaService;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
|
|
public LoginAuthenticationFilter(YamiUserDetailsService yamiUserDetailsService, WxMaService wxMaService) {
|
|
|
|
|
|
|
|
super("/login");
|
|
|
|
|
|
|
|
this.yamiUserDetailsService = yamiUserDetailsService;
|
|
|
|
|
|
|
|
this.wxMaService = wxMaService;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
|
|
|
|
|
|
|
|
if (!ServletUtil.METHOD_POST.equals(request.getMethod())) {
|
|
|
|
|
|
|
|
throw new AuthenticationServiceException(
|
|
|
|
|
|
|
|
"Authentication method not supported: " + request.getMethod());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
String requestBody = getStringFromStream(request);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (StrUtil.isBlank(requestBody)) {
|
|
|
|
|
|
|
|
throw new AuthenticationServiceException("无法获取输入信息");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
MiniAppAuthenticationToken authentication = Json.parseObject(requestBody, MiniAppAuthenticationToken.class);
|
|
|
|
|
|
|
|
String code = String.valueOf(authentication.getPrincipal());
|
|
|
|
|
|
|
|
YamiUser loadedUser = null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
WxMaJscode2SessionResult session = null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AppConnect appConnect = new AppConnect();
|
|
|
|
|
|
|
|
appConnect.setAppId(App.MINI.value());
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
session = wxMaService.getUserService().getSessionInfo(code);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
loadedUser = yamiUserDetailsService.loadUserByAppIdAndBizUserId(App.MINI,session.getOpenid());
|
|
|
|
|
|
|
|
} catch (WxErrorException e) {
|
|
|
|
|
|
|
|
throw new WxErrorExceptionBase(e.getMessage());
|
|
|
|
|
|
|
|
} catch (UsernameNotFoundExceptionBase var6) {
|
|
|
|
|
|
|
|
if (session == null) {
|
|
|
|
|
|
|
|
throw new WxErrorExceptionBase("无法获取用户登陆信息");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
appConnect.setBizUserId(session.getOpenid());
|
|
|
|
|
|
|
|
appConnect.setBizUnionid(session.getUnionid());
|
|
|
|
|
|
|
|
yamiUserDetailsService.insertUserIfNecessary(appConnect);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (loadedUser == null) {
|
|
|
|
|
|
|
|
loadedUser = yamiUserDetailsService.loadUserByAppIdAndBizUserId(App.MINI, appConnect.getBizUserId());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
MiniAppAuthenticationToken result = new MiniAppAuthenticationToken(loadedUser, authentication.getCredentials());
|
|
|
|
|
|
|
|
result.setDetails(authentication.getDetails());
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String getStringFromStream(HttpServletRequest req) {
|
|
|
|
|
|
|
|
ServletInputStream is;
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
is = req.getInputStream();
|
|
|
|
|
|
|
|
int nRead = 1;
|
|
|
|
|
|
|
|
int nTotalRead = 0;
|
|
|
|
|
|
|
|
byte[] bytes = new byte[10240];
|
|
|
|
|
|
|
|
while (nRead > 0) {
|
|
|
|
|
|
|
|
nRead = is.read(bytes, nTotalRead, bytes.length - nTotalRead);
|
|
|
|
|
|
|
|
if (nRead > 0) {
|
|
|
|
|
|
|
|
nTotalRead = nTotalRead + nRead;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return new String(bytes, 0, nTotalRead, StandardCharsets.UTF_8);
|
|
|
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
|
|
return "";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
|
|
public void setAuthenticationManager(AuthenticationManager authenticationManager) {
|
|
|
|
|
|
|
|
super.setAuthenticationManager(authenticationManager);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
|
|
public void setAuthenticationSuccessHandler(AuthenticationSuccessHandler successHandler) {
|
|
|
|
|
|
|
|
super.setAuthenticationSuccessHandler(successHandler);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
|
|
public void setAuthenticationFailureHandler(AuthenticationFailureHandler failureHandler) {
|
|
|
|
|
|
|
|
super.setAuthenticationFailureHandler(failureHandler);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|