Pārlūkot izejas kodu

Merge branch 'wxlogin' into 'DEV'

Wxlogin



See merge request !663

huangyong 7 gadi atpakaļ
vecāks
revīzija
a50ec788ad

+ 1 - 1
mooctest-site-server/pom.xml

@@ -17,7 +17,7 @@
         <dependency>
             <groupId>cn.iselab.mooctest</groupId>
             <artifactId>user-dubbo-api</artifactId>
-            <version>1.0.16</version>
+            <version>1.0.20</version>
         </dependency>
 
         <dependency>

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/ClientFeatureConfiguration.java

@@ -15,4 +15,5 @@ public class ClientFeatureConfiguration {
     private boolean email;
     private boolean oss;
     private boolean webide;
+    private boolean wechat;
 }

+ 2 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/AssignedTaskDao.java

@@ -7,6 +7,7 @@ import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.PagingAndSortingRepository;
 import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Propagation;
 
 import javax.transaction.Transactional;
 import java.util.List;
@@ -14,7 +15,7 @@ import java.util.List;
 /**
  * Created by Liu on 2016/12/27.
  */
-@Transactional
+@Transactional()
 public interface AssignedTaskDao extends PagingAndSortingRepository<AssignedTask, Long> {
 
     List<AssignedTask> findByTaskIdAndWorkerId(long taskId, long workerId);

+ 73 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/wechat/Token.java

@@ -0,0 +1,73 @@
+package cn.iselab.mooctest.site.data.wechat;
+
+import java.util.Date;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午4:38 2018/4/2
+ * @Modified By:
+ */
+public class Token {
+
+    // 接口访问凭证
+    private String accessToken;
+    // 凭证有效期,单位:秒
+    private int expiresIn;
+    private Long createTime;
+
+    private String refresh_token;
+
+    private String openId;
+
+    public Token() {
+        createTime = System.currentTimeMillis();
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    public void setAccessToken(String accessToken) {
+        this.accessToken = accessToken;
+    }
+
+    public int getExpiresIn() {
+        return expiresIn;
+    }
+
+    public void setExpiresIn(int expiresIn) {
+        this.expiresIn = expiresIn;
+    }
+
+    public boolean isValid() {
+        if ((System.currentTimeMillis() - createTime) < (expiresIn - 100) * 1000) {
+            return true;
+        }
+        return false;
+    }
+
+    public String getRefresh_token() {
+        return refresh_token;
+    }
+
+    public void setRefresh_token(String refresh_token) {
+        this.refresh_token = refresh_token;
+    }
+
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+}

+ 17 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/WeChatService.java

@@ -0,0 +1,17 @@
+package cn.iselab.mooctest.site.rpc.user;
+
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import cn.iselab.mooctest.rpc.user.data.UserWechatDTO;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午3:20 2018/4/17
+ * @Modified By:
+ */
+public interface WeChatService {
+
+    UserWechatDTO loginByCode(String code);
+
+    UserDTO setUserWechat(UserWechatDTO wechatDTO);
+}

+ 31 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/impl/WeChatServiceImpl.java

@@ -0,0 +1,31 @@
+package cn.iselab.mooctest.site.rpc.user.impl;
+
+import cn.iselab.mooctest.rpc.user.api.WechatService;
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import cn.iselab.mooctest.rpc.user.data.UserWechatDTO;
+import cn.iselab.mooctest.site.rpc.user.WeChatService;
+import com.alibaba.dubbo.config.annotation.Reference;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午3:20 2018/4/17
+ * @Modified By:
+ */
+@Service
+public class WeChatServiceImpl implements WeChatService {
+
+    @Reference(version = "1.0.0")
+    WechatService wechatService;
+
+    @Override
+    public UserWechatDTO loginByCode(String code){
+        return wechatService.loginByCode(code);
+    }
+
+    @Override
+    public UserDTO setUserWechat(UserWechatDTO wechatDTO){
+        return wechatService.setUserWechat(wechatDTO);
+    }
+}

+ 129 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/util/http/HttpClientUtils.java

@@ -0,0 +1,129 @@
+package cn.iselab.mooctest.site.util.http;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.ssl.TrustStrategy;
+import ytx.org.apache.http.conn.ssl.X509HostnameVerifier;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocket;
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+import java.security.GeneralSecurityException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午8:25 2018/4/2
+ * @Modified By:
+ */
+public class HttpClientUtils {
+
+    public static final int connTimeout=10000;
+    public static final int readTimeout=10000;
+    public static final String charset="UTF-8";
+    private static HttpClient client = null;
+
+    static {
+        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
+        cm.setMaxTotal(128);
+        cm.setDefaultMaxPerRoute(128);
+        client = HttpClients.custom().setConnectionManager(cm).build();
+    }
+
+    public static String get(String url, String charset) throws Exception {
+        return get(url, charset, connTimeout, readTimeout);
+    }
+
+    public static String get(String url, String charset, Integer connTimeout,Integer readTimeout)
+            throws ConnectTimeoutException,SocketTimeoutException, Exception {
+
+        HttpClient client = null;
+        HttpGet get = new HttpGet(url);
+        String result = "";
+        try {
+            // 设置参数
+            RequestConfig.Builder customReqConf = RequestConfig.custom();
+            if (connTimeout != null) {
+                customReqConf.setConnectTimeout(connTimeout);
+            }
+            if (readTimeout != null) {
+                customReqConf.setSocketTimeout(readTimeout);
+            }
+            get.setConfig(customReqConf.build());
+
+            HttpResponse res = null;
+
+            if (url.startsWith("https")) {
+                // 执行 Https 请求.
+                client = createSSLInsecureClient();
+                res = client.execute(get);
+            } else {
+                // 执行 Http 请求.
+                client = HttpClientUtils.client;
+                res = client.execute(get);
+            }
+
+            result = IOUtils.toString(res.getEntity().getContent(), charset);
+        } finally {
+            get.releaseConnection();
+            if (url.startsWith("https") && client != null && client instanceof CloseableHttpClient) {
+                ((CloseableHttpClient) client).close();
+            }
+        }
+        return result;
+    }
+
+    private static CloseableHttpClient createSSLInsecureClient() throws GeneralSecurityException {
+        try {
+            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+                    return true;
+                }
+            }).build();
+
+            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {
+
+                @Override
+                public boolean verify(String arg0, SSLSession arg1) {
+                    return true;
+                }
+
+                @Override
+                public void verify(String host, SSLSocket ssl)
+                        throws IOException {
+                }
+
+                @Override
+                public void verify(String host, X509Certificate cert)
+                        throws SSLException {
+                }
+
+                @Override
+                public void verify(String host, String[] cns,
+                                   String[] subjectAlts) throws SSLException {
+                }
+
+            });
+
+            return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+
+        } catch (GeneralSecurityException e) {
+            throw e;
+        }
+    }
+
+}

+ 19 - 7
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/WechatController.java

@@ -1,16 +1,15 @@
 package cn.iselab.mooctest.site.web.ctrl;
 
+import cn.iselab.mooctest.rpc.user.data.UserWechatDTO;
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
-import cn.iselab.mooctest.site.service.TargetGraphService;
+import cn.iselab.mooctest.site.web.data.UserVO;
 import cn.iselab.mooctest.site.web.data.internal.*;
 import cn.iselab.mooctest.site.web.logic.WechatLogic;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 /**
  * @author sean
@@ -26,8 +25,6 @@ public class WechatController extends BaseController {
     @Autowired
     private WechatLogic wechatLogic;
 
-    @Autowired
-    private TargetGraphService targetGraphService;
     /**
      *
      * GET methods
@@ -112,4 +109,19 @@ public class WechatController extends BaseController {
     public String joinGroup(HttpServletRequest request, @RequestBody JoinGroupWechatVO body) {
         return wechatLogic.joinGroup(request, body);
     }
+
+    @RequestMapping(value = UrlConstants.API_WECHAT + "login",method = RequestMethod.GET)
+    public String login(@RequestParam(value = "code")String code,HttpServletResponse response,HttpServletRequest request)throws Exception{
+        response.setHeader("Content-Type","x-javascript");
+        try {
+            return wechatLogic.wxLogin(code, request);
+        }catch (Exception e){
+            return "<html><head></head><body>非法用户,请重新登录或者联系管理员!</body></html>";
+        }
+    }
+
+    @RequestMapping(value = UrlConstants.API_WECHAT + "user",method = RequestMethod.PUT)
+    public boolean bind(@RequestBody UserWechatDTO wechatDTO){
+        return wechatLogic.bind(wechatDTO);
+    }
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/Bug2CaseVO.java

@@ -1,11 +1,13 @@
 package cn.iselab.mooctest.site.web.data;
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonInclude;
 
 /**
  * created by zsj in 15:32 2018/2/28
  **/
 @JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonIgnoreProperties
 public class Bug2CaseVO {
 
     private Long id;

+ 5 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/PermissionVO.java

@@ -65,4 +65,9 @@ public class PermissionVO {
     public void setType(String type) {
         this.type = type;
     }
+
+    @Override
+    public String toString(){
+        return this.resource+":"+this.operation;
+    }
 }

+ 33 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/UserInfo.java

@@ -0,0 +1,33 @@
+package cn.iselab.mooctest.site.web.data;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author ROKG
+ * @Description
+ * @Date: Created in 下午8:57 2018/4/2
+ * @Modified By:
+ */
+@Data
+public class UserInfo {
+
+    private String openid;
+
+    private String nickname;
+
+    private String sex;
+
+    private String headimgurl;
+
+    private String unionid;
+
+    private String country;
+
+    private String province;
+
+    private List<String> privilege;
+
+    private String city;
+}

+ 3 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/UserVO.java

@@ -1,5 +1,7 @@
 package cn.iselab.mooctest.site.web.data;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -51,6 +53,7 @@ public class UserVO extends BaseVO {
 
     private Boolean manualCheckValid;
 
+    @JsonIgnore
     private Integer availability;
 
     public Long getId() {

+ 9 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/WechatLogic.java

@@ -1,5 +1,8 @@
 package cn.iselab.mooctest.site.web.logic;
 
+import cn.iselab.mooctest.rpc.user.data.UserWechatDTO;
+import cn.iselab.mooctest.site.web.data.UserVO;
+
 import cn.iselab.mooctest.site.web.data.internal.JoinGroupWechatVO;
 
 import javax.servlet.http.HttpServletRequest;
@@ -39,4 +42,10 @@ public interface WechatLogic {
     String getContests(HttpServletRequest request);
 
     String getWorkerContests(HttpServletRequest request);
+
+    String wxLogin(String code,HttpServletRequest request)throws Exception;
+
+    boolean bind(UserWechatDTO dto);
+
+    UserVO register(UserWechatDTO dto);
 }

+ 80 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/WechatLogicImpl.java

@@ -1,19 +1,37 @@
 package cn.iselab.mooctest.site.web.logic.impl;
 
+import cn.iselab.mooctest.rpc.user.data.UserDTO;
+import cn.iselab.mooctest.rpc.user.data.UserWechatDTO;
+import cn.iselab.mooctest.rpc.user.data.WechatUserInfoDTO;
+import cn.iselab.mooctest.site.configure.realm.DefaultUsernamepasswordToken;
 import cn.iselab.mooctest.site.data.UserDTOForMT;
 import cn.iselab.mooctest.site.models.AssignedTask;
 import cn.iselab.mooctest.site.models.ContestMentorAssignedTask;
+import cn.iselab.mooctest.site.models.Permission;
+import cn.iselab.mooctest.site.rpc.user.WeChatService;
 import cn.iselab.mooctest.site.service.*;
 import cn.iselab.mooctest.site.service.application.WechatService;
+import cn.iselab.mooctest.site.util.data.Converter;
+import cn.iselab.mooctest.site.util.data.EncryptionUtil;
+import cn.iselab.mooctest.site.web.data.PermissionVO;
+import cn.iselab.mooctest.site.web.data.UserVO;
 import cn.iselab.mooctest.site.web.data.internal.ContestResultVO;
 import cn.iselab.mooctest.site.web.data.internal.JoinGroupWechatVO;
+import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
+import cn.iselab.mooctest.site.web.logic.MenuLogic;
+import cn.iselab.mooctest.site.web.logic.UserLogic;
 import cn.iselab.mooctest.site.web.logic.WechatLogic;
+import com.google.gson.Gson;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.AccountException;
+import org.apache.shiro.subject.Subject;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletRequest;
+import java.net.URLEncoder;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -35,6 +53,20 @@ public class WechatLogicImpl implements WechatLogic {
     ContestMentorService contestMentorService;
     @Autowired
     User2RoleService user2RoleService;
+    @Autowired
+    WeChatService weChatRpcService;
+    @Autowired
+    private UserLogic userLogic;
+    @Autowired
+    private RecordService recordService;
+    @Autowired
+    private OpenId2UserIdService openId2UserIdService;
+    @Autowired
+    private MenuLogic menuLogic;
+    @Autowired
+    private ManagerPropertyService managerPropertyService;
+    @Autowired
+    private PermissionService permissionService;
 
     public static final int HTTP_OK = 200;
     private static final int HTTP_INTERNAL_ERROR = 500;
@@ -384,10 +416,54 @@ public class WechatLogicImpl implements WechatLogic {
         return generateResponse(HTTP_OK,user.getName(),jsonArray.toString());
     }
 
-    /**
-     * POST
-     */
-
+    @Override
+    public String wxLogin(String code,HttpServletRequest request)throws Exception{
+        UserWechatDTO wechatDTO=weChatRpcService.loginByCode(code);
+        if(wechatDTO.getType()==UserWechatDTO.OLD){
+            UserDTO userDTO=wechatDTO.getUser();
+            DefaultUsernamepasswordToken token = new DefaultUsernamepasswordToken(userDTO.getEmail(),
+                    userDTO.getPassword());
+            token.setLoginType("email&mobile");
+            Subject currentUser = SecurityUtils.getSubject();
+            currentUser.login(token);
+            UserVO userVO= Converter.convert(UserVO.class,userDTO);
+            if (userVO.getAvailability() != 1) {
+                throw new HttpBadRequestException("user has been forbidden");
+            }
+            if (user2RoleService.getByUserId(userVO.getId()).size() == 0) {
+                userLogic.adapUsertoEnterprise(userVO);
+            }
+            SecurityUtils.getSubject().getSession().setAttribute("userId", userDTO.getId());
+
+            recordService.recordLoginAction(request, userVO.getId());
+            userVO.setMenuVOs(menuLogic.getMenuListByUserId(userVO.getId()));
+            userVO.setOpenId(openId2UserIdService.findOpenIdByUserId(userVO.getId()));
+
+            List<Permission> permissions=permissionService.findByUserId(userDTO.getId());
+            System.out.println(new Gson().toJson(userVO).toString());
+            return "<html><head><script>"+
+                    "localStorage.setItem('permissionSet','"+new Gson().toJson(permissions.stream().map(p-> p.toString()).collect(Collectors.toList())).toString()
+                    +"');"+ "localStorage.setItem('user','"+new Gson().toJson(userVO).toString()+"');"+
+                    "window.opener.location='http://www.mooctest.net/user/main';window.top.close();"+
+                    "</script></head><body></body></html>";
+        }else{
+            WechatUserInfoDTO userInfoDTO=wechatDTO.getUserInfo();
+            return "<html><head><script>"+
+                    "localStorage.setItem('wechatInfo','"+new Gson().toJson(userInfoDTO).toString()+"');"+
+                    "window.opener.location='http://www.mooctest.net/wechatLogin';window.top.close();"+
+                    "</script></head><body></body></html>";
+        }
+    }
 
+    @Override
+    public boolean bind(UserWechatDTO dto){
+        weChatRpcService.setUserWechat(dto);
+        return true;
+    }
 
+    @Override
+    public UserVO register(UserWechatDTO dto){
+        UserVO userVO=new UserVO();
+        return userVO;
+    }
 }