Sfoglia il codice sorgente

Merge branch 'dev' into feature/v2.0

# Conflicts:
#	sso-server/src/main/java/com/uas/sso/service/impl/LoginServiceImpl.java
liusw 6 anni fa
parent
commit
db6005b404

+ 4 - 4
sso-manage-console-web/config/index.js

@@ -17,18 +17,18 @@ module.exports = {
     proxyTable: {
       // proxy all backend requests to backend server
       '/api': {
-        target: 'http://10.1.51.50:8082',
+        target: 'http://10.1.51.83:8082',
         changeOrigin: true
       },
       '/login': {
-        target: 'http://10.1.51.50:8082',
+        target: 'http://10.1.51.83:8082',
         changeOrigin: true
       }
     },
 
     // Various Dev Server settings
-    host: '10.1.51.91', // can be overwritten by process.env.HOST
-    port: 3232, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+    host: '10.1.51.83', // can be overwritten by process.env.HOST
+    port: 9988, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
     autoOpenBrowser: false,
     errorOverlay: true,
     notifyOnErrors: true,

+ 27 - 1
sso-server/src/main/java/com/uas/sso/controller/AppealController.java

@@ -3,6 +3,7 @@ package com.uas.sso.controller;
 import com.uas.sso.entity.*;
 import com.uas.sso.exception.VisibleError;
 import com.uas.sso.service.*;
+import com.uas.sso.support.SystemSession;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.StringUtils;
@@ -31,7 +32,7 @@ public class AppealController extends BaseController {
     private AppealService appealService;
 
     /**
-     * 获取手机号验证码
+     * 更换管理员获取手机号验证码(可以未登录,并使用已注册账号)
      *
      * @author wangmh
      * @date 2018/1/16 10:37
@@ -53,6 +54,31 @@ public class AppealController extends BaseController {
         return success(data);
     }
 
+    /**
+     * 账号申述获取手机号验证码(需登录,并使用未注册账号)
+     * @param mobile
+     * @return
+     */
+    @RequestMapping(value = "/check/mobile", params = "_operate=account", method = RequestMethod.GET)
+    public ModelMap checkMobile2(String mobile) {
+        if (StringUtils.isEmpty(SystemSession.getUserAccount())) {
+            return error("用户未登录");
+        }
+        if (StringUtils.isEmpty(mobile)) {
+            return error("手机号不能为空");
+        }
+        User oldUser = userService.findByMobile(mobile);
+        if (!mobile.equals(SystemSession.getUserAccount().getMobile())) {
+            if (oldUser != null) {
+                return error("该手机号已被占用,请重新输入");
+            }
+        }
+        String token = getMobileToken(mobile);
+        ModelMap data = new ModelMap("token", token);
+        data.put("code", request.getSession().getAttribute("code"));
+        return success(data);
+    }
+
     /**
      * 校验验证码
      *

+ 2 - 0
sso-server/src/main/java/com/uas/sso/controller/LoginController.java

@@ -24,6 +24,7 @@ import com.uas.sso.service.UserService;
 import com.uas.sso.service.UserspaceService;
 import com.uas.sso.util.BeanUtil;
 import com.uas.sso.util.CaptchaUtil;
+import com.uas.sso.util.DomainUtil;
 import com.uas.sso.util.MessageUtils;
 import com.uas.sso.util.StringUtil;
 import org.slf4j.Logger;
@@ -426,6 +427,7 @@ public class LoginController extends BaseController {
         UserAccount userAccount = spaceUU == null ? personalAccountService.findOneByUserUU(appId, userUU) : userAccountService.findOneByUserUU(appId, userUU, spaceUU);
         SSOToken st = new SSOToken(request, userAccount.getMobile());
         st.setData(JSON.toJSONString(userAccount));
+        SSOHelper.getSSOService().getConfig().setCookieDomain(DomainUtil.getFirstDomain(request));
         SSOHelper.setSSOCookie(request, response, st, true);
         try {
             printJsonP("successCallback", "{success:'1'}");

+ 2 - 0
sso-server/src/main/java/com/uas/sso/controller/PersonalRegisterController.java

@@ -19,6 +19,7 @@ import com.uas.sso.service.PersonalAccountService;
 import com.uas.sso.service.UserService;
 import com.uas.sso.sync.service.SyncSsoService;
 import com.uas.sso.util.CaptchaUtil;
+import com.uas.sso.util.DomainUtil;
 import com.uas.sso.util.IpUtils;
 import com.uas.sso.util.MessageUtils;
 import com.uas.sso.util.PasswordLevelUtils;
@@ -149,6 +150,7 @@ public class PersonalRegisterController extends BaseController {
         List<String> loginUrls = appService.findAllLoginUrl();
         SSOToken st = new SSOToken(request, userAccount.getMobile());
         st.setData(JSON.toJSONString(userAccount));
+        SSOHelper.getSSOService().getConfig().setCookieDomain(DomainUtil.getFirstDomain(request));
         SSOHelper.setSSOCookie(request, response, st, true);
 
         syncSsoService.sendUserLoginStateToSso(0L, userAccount.getUserUU(), response, null);

+ 31 - 8
sso-server/src/main/java/com/uas/sso/controller/UserspaceRegisterController.java

@@ -19,6 +19,7 @@ import com.uas.sso.service.UserService;
 import com.uas.sso.service.UserspaceService;
 import com.uas.sso.sync.service.SyncSsoService;
 import com.uas.sso.util.CaptchaUtil;
+import com.uas.sso.util.DomainUtil;
 import com.uas.sso.util.IpUtils;
 import com.uas.sso.util.PasswordLevelUtils;
 import com.uas.sso.util.StringUtil;
@@ -221,6 +222,7 @@ public class UserspaceRegisterController extends BaseController {
                 .addAttribute("currentUrl", baseUrl);
         SSOToken st = new SSOToken(request, userAccount.getMobile());
         st.setData(JSON.toJSONString(userAccount));
+        SSOHelper.getSSOService().getConfig().setCookieDomain(DomainUtil.getFirstDomain(request));
         SSOHelper.setSSOCookie(request, response, st, true);
         syncSsoService.sendUserLoginStateToSso(userspace.getSpaceUU(), userspace.getAdminUU(), response, null);
         LOGGER.info("用户({})注册并登录成功,时间:{}", admin.getUserUU(), System.currentTimeMillis());
@@ -233,24 +235,45 @@ public class UserspaceRegisterController extends BaseController {
      * @throws UnsupportedEncodingException
      */
     @PostMapping("/admin")
-    public ModelMap registerLogin(AdminUserspaceRegister register) throws UnsupportedEncodingException {
+    public ModelMap registerLogin(AdminUserspaceRegister register) {
         // 1、拼装数据
+        String appId, spaceName, businessCode;
+        if (StringUtils.isEmpty(spaceName = register.getSpaceName())) {
+            return error("请填写正确的企业名称");
+        }
+        if (StringUtils.isEmpty(businessCode = register.getBusinessCode())) {
+            return error("请填写正确的企业营业执照号");
+        }
         Userspace userspace = new Userspace();
-        userspace.setSpaceName(register.getSpaceName());
-        userspace.setBusinessCode(register.getBusinessCode());
+        userspace.setSpaceName(spaceName);
+        userspace.setBusinessCode(businessCode);
         // 查询用户信息
-        User user = Optional.ofNullable(register.getUserUU())
+        User admin = Optional.ofNullable(register.getUserUU())
                 .map(userUU -> userService.findOne(userUU))
                 .orElse(null);
-        if (user == null) {
+        if (admin == null) {
             LOGGER.warn("通过登录管理员注册企业警告,用户uu号未注册,参数:{}", JSON.toJSONString(register));
             return error("用户uu号未注册");
         }
 
         ///2、注册
-        request.getSession().setAttribute("mobile", user.getMobile());
-        ModelMap data = this.register(userspace, user, register.getAppId(), register.getBaseUrl(), register.getT(), register.getReturnUrl(), true);
-        return data;
+        userspace.setAdmin(admin);
+        userspace = userspaceService.register(userspace, (appId = register.getAppId()) == null ? "sp" : appId);
+
+        // 发送邮件和短信
+        ModelMap info = new ModelMap();
+        info.addAttribute("enname", userspace.getSpaceName());
+        info.addAttribute("enuu", userspace.getSpaceUU());
+        sendEmail("templateForSendMailAfterRegister", admin.getEmail(), info);
+        sendSms("templateForSendSmsAfterRegister", admin.getMobile(), userspace.getSpaceName(), userspace.getSpaceUU());
+
+        // 添加日志
+        registerLogger.info(Type.REGISTER_USERSPACE.getValue(), Step.SECOND.getValue(), "通过管理员企业注册", userspace, appId);
+
+        ModelMap data = new ModelMap();
+        data.put("spaceUU", userspace.getSpaceUU());
+        data.put("accessSecret", userspace.getAccessSecret());
+        return success(data);
     }
 
     /**

+ 9 - 3
sso-server/src/main/java/com/uas/sso/service/impl/LoginServiceImpl.java

@@ -17,6 +17,7 @@ import com.uas.sso.foreign.factory.ForeignFactory;
 import com.uas.sso.foreign.service.ForeignService;
 import com.uas.sso.service.*;
 import com.uas.sso.sync.service.SyncSsoService;
+import com.uas.sso.util.DomainUtil;
 import com.uas.sso.util.PasswordLevelUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -322,14 +323,19 @@ public class LoginServiceImpl implements LoginService {
 
         // 设置cookie
         request.setAttribute(SSOConfig.SSO_COOKIE_MAXAGE, loginParam.getMaxage());
-        SSOToken st = new SSOToken(request, userAccount.getMobile());
-        st.setData(JSON.toJSONString(userAccount));
-        SSOHelper.setSSOCookie(request, response, st, true);
+        setCookie(userAccount);
         syncSsoService.sendUserLoginStateToSso(userAccount.getSpaceUU(), userAccount.getUserUU(), response, loginParam.getMaxage());
         LOGGER.info("用户({})登录成功,时间:{}", userUU, userRecord.getLastLoginTime());
         return loginByUser(userAccount, loginParam);
     }
 
+    private void setCookie(UserAccount userAccount) {
+        SSOToken st = new SSOToken(request, userAccount.getMobile());
+        st.setData(JSON.toJSONString(userAccount));
+        SSOHelper.getSSOService().getConfig().setCookieDomain(DomainUtil.getFirstDomain(request));
+        SSOHelper.setSSOCookie(request, response, st, true);
+    }
+
     private ModelMap getSpaceSelect(List<UserAccount> userAccounts, boolean personalEnable) {
         List<Map<String, Object>> spaces = new ArrayList<Map<String, Object>>();
         Map<String, Object> space = null;

+ 1 - 0
sso-server/src/main/java/com/uas/sso/service/impl/UserspaceServiceImpl.java

@@ -116,6 +116,7 @@ public class UserspaceServiceImpl implements UserspaceService {
         userspace.setValidCode((short) Status.NOT_APPLYING.getCode());
         userspace.setRegisterDate(new Timestamp(System.currentTimeMillis()));
         userspace.setFromApp(appId);
+        userspace.setAccessSecret(UUID.randomUUID().toString().replaceAll("\\-", ""));
 
         // 注册企业
         App app = appService.findOne(appId);

+ 84 - 0
sso-server/src/main/java/com/uas/sso/util/DomainUtil.java

@@ -0,0 +1,84 @@
+package com.uas.sso.util;
+
+import com.google.common.net.HttpHeaders;
+import com.uas.sso.exception.SSOException;
+import com.uas.sso.exception.VisibleError;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.regex.Pattern;
+
+/**
+ * 获取域名工具
+ *
+ * @author huyy
+ * @date 2018-11-14 15:46
+ */
+public class DomainUtil {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(DomainUtil.class);
+
+    /**
+     * 获取一级域名
+     *
+     * @param request
+     * @return
+     */
+    public static String getFirstDomain(HttpServletRequest request) {
+        // 获取请求host
+        String host = getHost(request);
+        // 把host拆分成一级域名
+        return getDomain(host);
+    }
+
+    /**
+     * 获取域名/IP地址和端口号
+     *
+     * @param request
+     * @return 域名/IP地址:端口号
+     */
+    private static String getHost(HttpServletRequest request) {
+        // 通过nginx反向代理
+        String host = request.getHeader("X-Forwarded-Host");
+        if (host == null) {
+            // 直接访问
+            host = request.getHeader(HttpHeaders.HOST);
+            LOGGER.debug("从请求头[Host]获取域名为:{}", host);
+        } else {
+            LOGGER.debug("从请求头[X-Forwarded-Host]获取域名为:{}", host);
+        }
+        if (host == null) {
+            LOGGER.warn("从请求头[X-Forwarded-Host, Host]获取域名失败");
+            throw new VisibleError("获取域名失败!");
+        }
+        return host;
+    }
+
+    /**
+     * 获取域名
+     *
+     * @param host 域名/IP地址:端口号
+     * @return
+     */
+    private static String getDomain(String host) {
+        String domain = host;
+        // 域名等级,1为一级域名
+        int level = 1;
+        // 去除端口号
+        domain = domain.split(":")[0];
+        String pattern = "^([a-zA-Z0-9]+([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}";
+        boolean isDomain = Pattern.matches(pattern, domain);
+        // 使用域名+端口号形式则解析域名
+        if (isDomain) {
+            String[] domains = domain.split("\\.");
+            int length = domains.length;
+            if (length < level + 1) {
+                LOGGER.warn("域名({})转换{}级域名出错!", host, level + 1);
+                throw new SSOException("域名错误!");
+            }
+            domain = domains[length - 2] + "." + domains[length - 1];
+        }
+        return domain;
+    }
+}