提交 5e66ece8 authored 作者: 吴德鹏's avatar 吴德鹏

识别注册用户的国家

上级 c53e0533
......@@ -15,10 +15,12 @@ import com.example.afrishop_v3.repository.UserRepository;
import com.example.afrishop_v3.security.jwt.JwtUtils;
import com.example.afrishop_v3.security.services.UserDetailsImpl;
import com.example.afrishop_v3.util.*;
import net.sf.json.JSONObject;
import org.apache.http.Consts;
import org.hashids.Hashids;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
......@@ -26,9 +28,12 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.Calendar;
import java.util.Date;
......@@ -46,7 +51,7 @@ public class AuthController extends Controller {
private final TbCfCouponRepository couponRepository;
private final TbCfToicouponRepository toicouponRepository;
private final NetworkRepository networkRepository;
// @PersistenceContext(unitName = "afrishop_v3")
// @PersistenceContext(unitName = "afrishop_v3")
private final EntityManager entityManager;
// private final TbCfOrderRepository cfOrderRepository;
// private final SecondOrderRepository secondOrderRepository;
......@@ -60,7 +65,7 @@ public class AuthController extends Controller {
private final JwtUtils jwtUtils;
private static Logger logger = LoggerFactory.getLogger(AuthController.class);
public AuthController(DomainProperties domainProperties,PasswordEncoder encoder,JwtUtils jwtUtils,AuthenticationManager authenticationManager, UserRepository userRepository, EmailHelper emailHelper, TbCfCouponRepository couponRepository, TbCfToicouponRepository toicouponRepository, NetworkRepository networkRepository, EntityManager entityManager) {
public AuthController(DomainProperties domainProperties, PasswordEncoder encoder, JwtUtils jwtUtils, AuthenticationManager authenticationManager, UserRepository userRepository, EmailHelper emailHelper, TbCfCouponRepository couponRepository, TbCfToicouponRepository toicouponRepository, NetworkRepository networkRepository, EntityManager entityManager) {
this.authenticationManager = authenticationManager;
this.userRepository = userRepository;
this.emailHelper = emailHelper;
......@@ -75,6 +80,7 @@ public class AuthController extends Controller {
// this.cfOrderRepository = cfOrderRepository;
// this.secondOrderRepository = secondOrderRepository;
// this.secondUserRepository = secondUserRepository;
}
// @GetMapping("count")
......@@ -143,6 +149,12 @@ public class AuthController extends Controller {
// return notFound;
// }
@GetMapping("/getRealIp")
public Result getRealIp(HttpServletRequest request) {
String ip = this.getRealIpAddress(request);
return new Result().setData(ip);
}
//Sign in using email/phone and password
@PostMapping("/signin")
public Result authenticateUser(@RequestBody LoginRequest loginRequest) {
......@@ -234,13 +246,12 @@ public class AuthController extends Controller {
//Register new user with email
@PostMapping("/signup")
public Result<?> registerUser(@RequestBody TbCfUserInfo signUpRequest) {
public Result<?> registerUser(@RequestBody TbCfUserInfo signUpRequest, HttpServletRequest request) {
try {
// boolean byAccount = userRepository.existsByAccount(signUpRequest.getEmail());
// if ( byAccount ) {
// return new Result(ResultCodeEnum.VALIDATE_ERROR.getCode(),"Error: Username is already taken!");
// }
String email = signUpRequest.getEmail();
String password = signUpRequest.getPassword();
......@@ -276,7 +287,7 @@ public class AuthController extends Controller {
signUpRequest.setUserId(IdUtil.createIdbyUUID());
fillUserNecessayInfo(signUpRequest);
fillUserNecessayInfo(signUpRequest, request);
signUpRequest.setPassword(encoder.encode(password));
......@@ -332,7 +343,7 @@ public class AuthController extends Controller {
}
@PostMapping("/signup/phone")
public Result<?> registerUserPhone(@RequestBody TbCfUserInfo signUpRequest) {
public Result<?> registerUserPhone(@RequestBody TbCfUserInfo signUpRequest, HttpServletRequest request) {
try {
// boolean byAccount = userRepository.existsByAccount(signUpRequest.getEmail());
// if ( byAccount ) {
......@@ -374,7 +385,7 @@ public class AuthController extends Controller {
signUpRequest.setUserId(IdUtil.createIdbyUUID());
fillUserNecessayInfo(signUpRequest);
fillUserNecessayInfo(signUpRequest, request);
signUpRequest.setPassword(encoder.encode(password));
......@@ -402,7 +413,7 @@ public class AuthController extends Controller {
@PostMapping(value = "/register/user")
public Result checkFirebase(@RequestBody TbCfUserInfo user) {
public Result checkFirebase(@RequestBody TbCfUserInfo user, HttpServletRequest request) throws IOException {
//Data to be userInfoVo
// {
// "firebaseUid":"firebaseUid",
......@@ -441,7 +452,7 @@ public class AuthController extends Controller {
// user.setPassword(encoder.encode(firebaseUid));
user.setUserId(userid);
fillUserNecessayInfo(user);
fillUserNecessayInfo(user, request);
user = userRepository.save(user);
......@@ -614,8 +625,19 @@ public class AuthController extends Controller {
}
//fill basic information for new user
private void fillUserNecessayInfo(TbCfUserInfo tbCfUserInfoVo) {
private void fillUserNecessayInfo(TbCfUserInfo tbCfUserInfoVo, HttpServletRequest request) throws IOException {
RestTemplate restTemplate = new RestTemplate();
if (tbCfUserInfoVo.getAvatar() == null) tbCfUserInfoVo.setAvatar(domainProperties.getProperty("user.avatar"));
// ResponseEntity forEntity2 = restTemplate.getForEntity("http://admin.afrieshop.com/api/upload/getRealIp", String.class);
// System.err.println(forEntity2.getBody());
// String body = (String) forEntity2.getBody();
// String ip = JSONObject.fromObject(body).getString("ip");
// System.out.println(ip);
String ip = getIpAddr(request);
String country = HttpsUtil.useIpFindCountry(ip);
// String country = HttpsUtil.ipToAdress(ip);
tbCfUserInfoVo.setCountry(country);
tbCfUserInfoVo.setUserNo(IdUtil.createIdByDate());
tbCfUserInfoVo.setPhoneFlag(StateConstant.INVALID);
tbCfUserInfoVo.setLoginCount(0);
......
......@@ -260,4 +260,31 @@ abstract class Controller {
}
return ip;
}
/**
* 获取IP地址
* @param request
* @return
*/
protected String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("X-Real-IP");
if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
return ip;
}
ip = request.getHeader("X-Forwarded-For");
if (!StringUtils.isBlank(ip) && !"unknown".equalsIgnoreCase(ip)) {
// 多次反向代理后会有多个IP值,第一个为真实IP。
int index = ip.indexOf(',');
if (index != -1) {
return ip.substring(0, index);
}
else {
return ip;
}
}
else {
return request.getRemoteAddr();
}
}
}
......@@ -81,7 +81,7 @@ public class FlutterWaveController extends Controller {
public ResponseEntity<String> payForOrderByCard(@RequestParam("orderId") String orderId, @RequestBody FlutterWaveCard flutterWaveCard) {
RaveConstant.PUBLIC_KEY = PUBLIC_KEY;
RaveConstant.SECRET_KEY = SECRET_KEY;
RaveConstant.ENVIRONMENT = Environment.LIVE; //or live
RaveConstant.ENVIRONMENT = Environment.STAGING; //or live
// Result result = new Result();
Optional<TbCfOrder> byId = repository.findById(orderId);
......
......@@ -187,6 +187,16 @@ public class TbCfUserInfo {
this.source = source;
}
private String country;
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public void setCodeSentTime(Date codeSentTime) {
this.codeSentTime = codeSentTime;
}
......
......@@ -2,6 +2,7 @@ package com.example.afrishop_v3.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import net.sf.json.JSONArray;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -10,17 +11,13 @@ import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.*;
import java.net.ConnectException;
import java.net.URL;
import java.security.SecureRandom;
import java.util.*;
/**
*
* @author mds
* @DateTime 2018年4月25日 下午2:17:16
* @Comment https工具类
......@@ -35,12 +32,12 @@ public class HttpsUtil {
}
/**
* @return
* @author wmt
* @DateTime 2019年4月17日 上午9:50:04
* @serverComment 请求微信code2Session接口获取openid等信息
* @return
*/
public static JSONObject findCode2Session(String code, String appId, String appSecret){
public static JSONObject findCode2Session(String code, String appId, String appSecret) {
String url = "https://api.weixin.qq.com/sns/jscode2session";
Map<String, Object> param = new HashMap<String, Object>();
param.put("appid", appId);
......@@ -54,13 +51,12 @@ public class HttpsUtil {
/**
* @return
* @author mds
* @DateTime 2018年4月25日 下午4:03:47
* @serverComment
* 获取基础支持token和ticket
* @return
* @serverComment 获取基础支持token和ticket
*/
public static JSONObject findToken(){
public static JSONObject findToken() {
String url = "https://api.weixin.qq.com/cgi-bin/token";
Map<String, Object> param = new HashMap<String, Object>();
param.put("grant_type", "client_credential");
......@@ -68,14 +64,14 @@ public class HttpsUtil {
param.put("secret", "7133214b34c3ee0dd294b1444ba46091");
url = urlParams(url, param);
JSONObject token = httpsReq(url, "GET", "");
if(token != null && !token.containsKey("errcode")){
if (token != null && !token.containsKey("errcode")) {
param.clear();
String accessToken = token.getString("access_token");
url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
param.put("type", "jsapi");
param.put("access_token", accessToken);
JSONObject ticket = httpsReq(urlParams(url, param), "GET", "");
if(ticket != null && 0 == ticket.getIntValue("errcode")){
if (ticket != null && 0 == ticket.getIntValue("errcode")) {
token.put("ticket", ticket.get("ticket"));
}
}
......@@ -83,14 +79,13 @@ public class HttpsUtil {
}
/**
* @author mds
* @DateTime 2018年4月25日 下午4:23:07
* @serverComment
* 通过code换取网页授权access_token
* @param code
* @return
* @author mds
* @DateTime 2018年4月25日 下午4:23:07
* @serverComment 通过code换取网页授权access_token
*/
public static JSONObject findHtmToken(String code, String appId, String appSecret){
public static JSONObject findHtmToken(String code, String appId, String appSecret) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
Map<String, Object> param = new HashMap<String, Object>();
param.put("grant_type", "authorization_code");
......@@ -102,18 +97,17 @@ public class HttpsUtil {
}
/**
* @author mds
* @DateTime 2018年4月25日 下午4:47:09
* @serverComment
* code 获取用户信息
* @param code
* @return
* @author mds
* @DateTime 2018年4月25日 下午4:47:09
* @serverComment code 获取用户信息
*/
public static JSONObject findUserInfo(String code, String appId, String appSecret){
public static JSONObject findUserInfo(String code, String appId, String appSecret) {
//获取网页授权access_token
JSONObject token = findHtmToken(code, appId, appSecret);
System.out.println("获取网页授权="+token);
if(!token.containsKey("errcode")){
System.out.println("获取网页授权=" + token);
if (!token.containsKey("errcode")) {
String url = "https://api.weixin.qq.com/sns/userinfo";
Map<String, Object> param = new HashMap<String, Object>();
param.put("access_token", token.get("access_token"));
......@@ -129,14 +123,13 @@ public class HttpsUtil {
/**
* 发送Https请求并获取结果
*
*
* @param method
* @param data
* @return
*/
public static JSONObject httpsReq(String reqUrl, String method, String data) {
String result = (String)sendHttps(reqUrl, method, data, false);
if(StringUtils.isNotBlank(result)){
String result = (String) sendHttps(reqUrl, method, data, false);
if (StringUtils.isNotBlank(result)) {
return JSON.parseObject(result);
}
return null;
......@@ -144,8 +137,9 @@ public class HttpsUtil {
/**
* 发送Https请求并获取结果
*
* <p>
* 】
*
* @param method
* @param data
* @param xml 返回是否xml
......@@ -156,7 +150,7 @@ public class HttpsUtil {
Map<String, String> resMap = new HashMap<String, String>();
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new X509TM() };
TrustManager[] tm = {new X509TM()};
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new SecureRandom());
......@@ -186,9 +180,9 @@ public class HttpsUtil {
}
//获取返回信息
InputStream input = conn.getInputStream();
if(xml){
if (xml) {
resMap = XmlUtil.xmlToMap(input);
}else{
} else {
InputStreamReader inputSR = new InputStreamReader(input, "utf-8");
BufferedReader bufRea = new BufferedReader(inputSR);
String str = null;
......@@ -210,27 +204,26 @@ public class HttpsUtil {
// TODO Auto-generated catch block
logger.error(e.getMessage(), e);
}
if(xml){
if (xml) {
return resMap;
}else{
} else {
return result.toString();
}
}
/**
* @author mds
* @DateTime 2018年4月25日 下午2:38:54
* @serverComment
* Map 转 url 参数
* @param param
* @return
* @author mds
* @DateTime 2018年4月25日 下午2:38:54
* @serverComment Map 转 url 参数
*/
public static String urlParams(String url, Map<String, Object> param) {
if (param == null) {
return "";
}
StringBuffer params = new StringBuffer();
if(StringUtils.isNotBlank(url)){
if (StringUtils.isNotBlank(url)) {
params.append(url + "?");
}
for (Map.Entry<String, Object> entry : param.entrySet()) {
......@@ -245,18 +238,17 @@ public class HttpsUtil {
}
/**
* @author mds
* @DateTime 2018年5月2日 下午2:30:38
* @serverComment
* Map 转 url 参数
* @param params
* @return
* @author mds
* @DateTime 2018年5月2日 下午2:30:38
* @serverComment Map 转 url 参数
*/
@SuppressWarnings("rawtypes")
public static String urlParams(String url, SortedMap<Object, Object> params){
public static String urlParams(String url, SortedMap<Object, Object> params) {
//实际可以不排序
StringBuffer sb = new StringBuffer();
if(StringUtils.isNotBlank(url)){
if (StringUtils.isNotBlank(url)) {
sb.append(url + "?");
}
Set es = params.entrySet();
......@@ -269,7 +261,53 @@ public class HttpsUtil {
sb.append(k + "=" + v + "&");
}
}
sb.deleteCharAt(sb.length()-1);//删掉最后一个&
sb.deleteCharAt(sb.length() - 1);//删掉最后一个&
return sb.toString();
}
/**
* http://opendata.baidu.com/api.php?query=41.186.78.199&co=&resource_id=6006&oe=utf8
*
* @param ip
* @return adress
*/
public static String ipToAdress(String ip) throws IOException {
String url = "http://opendata.baidu.com/api.php";
Map<String, Object> params = new HashMap();
params.put("query", ip);
params.put("co", "");
params.put("resource_id", "6006");
params.put("oe", "utf8");
String result = HttpClientUtil.createConnection(url, params, "utf-8");
System.out.println("ip:" + ip);
System.out.println("result:" + result);
net.sf.json.JSONObject jsonObject = net.sf.json.JSONObject.fromObject(result);
JSONArray data = jsonObject.getJSONArray("data");
String location = "";
for (int i = 0; i < data.size(); i++) {
net.sf.json.JSONObject object = data.getJSONObject(i);
location = object.getString("location");
}
if (StringUtils.isNotBlank(location)) {
String[] s = location.split(" ");
location = s[0];
}
return location;
}
/**
* http://ip-api.com/json/49.65.247.32?lang=zh-CN
*/
public static String useIpFindCountry(String ip) throws IOException {
String url = "http://ip-api.com/json/" + ip;
Map<String, Object> params = new HashMap();
params.put("lang", "zh-CN");
String result = HttpClientUtil.createConnection(url, params, "utf-8");
JSONObject jsonObject = JSONObject.parseObject(result);
String country = jsonObject.getString("country");
System.out.println("result:"+result);
System.out.println("country:" + country);
return country;
}
}
server.servlet.context-path=/zion
spring.jpa.hibernate.ddl-auto=update
server.port=8083
spring.profiles.active=prod
spring.profiles.active=test
#spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/afrishop_test?useUnicode=true&connectionCollation=utf8mb4_general_ci&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
#spring.datasource.username=root
#spring.datasource.password=Diaoyunnuli.8
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论