Parcourir la source

Merge branch 'master' of http://192.168.1.220:10080/esb/esb

Airhead il y a 8 ans
Parent
commit
16248e3acf

+ 81 - 3
src/main/java/com/yihu/hos/common/CommonPageController.java

@ -1,14 +1,21 @@
package com.yihu.hos.common;
import com.yihu.hos.web.framework.util.PKUtil;
import com.yihu.hos.web.framework.util.controller.BaseController;
import com.yihu.hos.system.model.SystemUser;
import com.yihu.hos.tenant.service.AuthenticateService;
import com.yihu.hos.web.framework.util.controller.BaseController;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
 * 数据采集配置页面
@ -18,14 +25,85 @@ import javax.servlet.http.HttpSession;
@Controller("commonPageController")
public class CommonPageController extends BaseController {
    @Value("${spring.administrators}")
    private String saasAdmin;
    @Autowired
    private AuthenticateService authenticateService;
    /*
    登录页面
     */
    @RequestMapping("loginPage")
    public String login(Model model) {
    public String login(Model model, HttpServletRequest request,HttpServletResponse response) {
        HttpSession session = request.getSession();
        try {
            boolean auth = authenticateService.auth(session, saasAdmin);
            if (!auth){
                //授权失败
                response.setCharacterEncoding("UTF-8");
                response.setHeader("Content-type", "text/html;charset=UTF-8");
                PrintWriter out = null;
                try {
                    out = response.getWriter();
                    out.print("<script>alert('登录地址有误-用户授权失败!');</script>");
                    response.sendRedirect("/esb/loginPage");
                    out.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    IOUtils.closeQuietly(out);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        model.addAttribute("contentPage","/common/login");
        return "pageView";
    }
    /**
     * 租户登录页面
     * @param model
     * @param tenantName
     * @param request
     * @return
     */
    @RequestMapping("{tenantName}/loginPage")
    public String tenantLogin(Model model,
                            @PathVariable(name = "tenantName") String tenantName,
                            HttpServletRequest request,HttpServletResponse response) throws IOException {
        HttpSession session = request.getSession();
        boolean auth = false;
        try {
            auth = authenticateService.auth(session, tenantName);
        System.out.println("auth:   "+auth);
        if (!auth) {
            //授权失败,切换回管理平台数据库
            auth = authenticateService.auth(session, saasAdmin);
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-type", "text/html;charset=UTF-8");
            PrintWriter out = null;
            try {
                out = response.getWriter();
                out.print("<script>alert('请求地址不存在!');</script>");
                response.sendRedirect("/esb/loginPage");
                out.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeQuietly(out);
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
        model.addAttribute("contentPage","/common/login");
        return "pageView";
    }
    /*

+ 5 - 0
src/main/java/com/yihu/hos/common/constants/ContextAttributes.java

@ -5,4 +5,9 @@ package com.yihu.hos.common.constants;
 */
public interface ContextAttributes {
    String SCHEMA = "schema";
    String USER_INFO = "userInfo";
    String TENANT_SESSION = "tenantSession";
    String GLOBAL_DB = "global_db";//平台管理中心库
}

+ 13 - 0
src/main/java/com/yihu/hos/interceptor/AuditInterceptor.java

@ -3,10 +3,12 @@ package com.yihu.hos.interceptor;
import com.yihu.hos.common.constants.ContextAttributes;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.Iterator;
/**
@ -32,6 +34,17 @@ public class AuditInterceptor extends EmptyInterceptor {
        return super.onPrepareStatement(completeSql);
    }
    @Override
    public void onDelete(
            Object entity,
            Serializable id,
            Object[] state,
            String[] propertyNames,
            Type[] types) {
        System.out.println("33333333333333");
        super.onDelete(entity,id,state,propertyNames,types);
    }
    @Override
    public void preFlush(Iterator entities) {

+ 1 - 1
src/main/java/com/yihu/hos/interceptor/LocalContext.java

@ -12,7 +12,7 @@ public class LocalContext {
            return new LocalContext();
        }
    };
    private final Map<String, String> attachments = new HashMap<>();
    private static final Map<String, String> attachments = new HashMap<>();
    public static LocalContext getContext() {
        return LOCAL.get();

+ 20 - 4
src/main/java/com/yihu/hos/system/controller/SystemController.java

@ -1,7 +1,11 @@
package com.yihu.hos.system.controller;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.system.service.intf.ISystemManager;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.tenant.service.AuthenticateService;
import com.yihu.hos.web.framework.model.ActionResult;
import com.yihu.hos.web.framework.model.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@ -23,6 +27,9 @@ public class SystemController {
    @Autowired
    private ISystemManager ehr;
    @Autowired
    private AuthenticateService authenticateService;
    /**
     * 判断是否登录
     * @return
@ -59,6 +66,7 @@ public class SystemController {
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
            return Result.error(ex.getMessage());
        }
    }
@ -68,15 +76,23 @@ public class SystemController {
        */
    @RequestMapping("logoutAction")
    @ResponseBody
    public Result logoutAction(HttpServletRequest request) {
    public ActionResult logoutAction(HttpServletRequest request) {
        try {
            HttpSession session = request.getSession();
            String userCode = "";
            TenantSession tenantSession = (TenantSession)session.getAttribute(ContextAttributes.TENANT_SESSION);
            if (tenantSession !=null){
                userCode = tenantSession.getUserCode();
                authenticateService.logout(session);
            }
            session.removeAttribute("userInfo");
            return Result.success("退出登录");
            ActionResult re = new ActionResult(true, "登出成功!");
            re.setData(userCode);
            return re;
        }
        catch (Exception ex)
        {
            return Result.error(ex.getMessage());
            return new ActionResult(false, "登出异常!");
        }
    }

+ 24 - 0
src/main/java/com/yihu/hos/tenant/dao/TenantDao.java

@ -0,0 +1,24 @@
package com.yihu.hos.tenant.dao;
import com.yihu.hos.tenant.model.TenantModel;
import com.yihu.hos.web.framework.dao.SQLGeneralDAO;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/12/2.
 */
@Repository("tenantDao")
public class TenantDao extends SQLGeneralDAO {
    public static final String BEAN_ID = "tenantDao";
    public List<TenantModel> getTenantList(String name) throws Exception {
        List<TenantModel> list = (List<TenantModel>) super.hibernateTemplate.find("from TenantModel s where s.name=? and s.valid = 1", name);
        return list;
    }
}

+ 2 - 1
hos-saas/src/main/java/com/yihu/hos/saas/models/common/IdModel.java

@ -3,7 +3,7 @@
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.hos.saas.models.common;
package com.yihu.hos.tenant.model;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@ -12,6 +12,7 @@ import javax.persistence.MappedSuperclass;
import java.io.Serializable;
/**
 *  //TODO 之后需要移动到公共目录
 * 统一定义id的entity基类.
 * 
 * 基类统一定义id的属性名称、数据类型、列名映射及生成策略.

+ 109 - 0
src/main/java/com/yihu/hos/tenant/model/TenantModel.java

@ -0,0 +1,109 @@
package com.yihu.hos.tenant.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Date;
/**
 *  租户表
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/12/2.
 */
@Entity
@Table(name = "tenant")
public class TenantModel extends IdModel{
    private String code;
    private String name;
    private String password;
    private String schema;
    private Date created;
    private Integer createdUnix;
    private Date updated;
    private Integer updatedUnix;
    private Integer valid;
    @Column(name="code")
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Column(name="password")
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Column(name="schema")
    public String getSchema() {
        return schema;
    }
    public void setSchema(String schema) {
        this.schema = schema;
    }
    @Column(name="created")
    public Date getCreated() {
        return created;
    }
    public void setCreated(Date created) {
        this.created = created;
    }
    @Column(name="created_unix")
    public Integer getCreatedUnix() {
        return createdUnix;
    }
    public void setCreatedUnix(Integer createdUnix) {
        this.createdUnix = createdUnix;
    }
    @Column(name="updated")
    public Date getUpdated() {
        return updated;
    }
    public void setUpdated(Date updated) {
        this.updated = updated;
    }
    @Column(name="updated_unix")
    public Integer getUpdatedUnix() {
        return updatedUnix;
    }
    public void setUpdatedUnix(Integer updatedUnix) {
        this.updatedUnix = updatedUnix;
    }
    @Column(name="valid")
    public Integer getValid() {
        return valid;
    }
    public void setValid(Integer valid) {
        this.valid = valid;
    }
}

+ 51 - 0
src/main/java/com/yihu/hos/tenant/model/TenantSession.java

@ -0,0 +1,51 @@
package com.yihu.hos.tenant.model;
import java.util.UUID;
/**
 * @created Airhead 2016/11/16.
 */
public class TenantSession {
    private String userCode;
    private String token;
    private String schema;
    public TenantSession() {
    }
    public TenantSession(String userCode, String schema) {
        this.userCode = userCode;
        this.schema = schema;
        token = UUID.randomUUID().toString();
    }
    public TenantSession(String userCode, String schema,String token) {
        this.userCode = userCode;
        this.schema = schema;
        this.token = token;
    }
    public String getSchema() {
        return schema;
    }
    public void setSchema(String schema) {
        this.schema = schema;
    }
    public String getUserCode() {
        return userCode;
    }
    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }
}

+ 78 - 0
src/main/java/com/yihu/hos/tenant/service/AuthenticateService.java

@ -0,0 +1,78 @@
package com.yihu.hos.tenant.service;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.tenant.model.TenantModel;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.system.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * @created Airhead 2016/11/16.
 */
@Service
public class AuthenticateService {
    @Autowired
    private UserDao userDao;
    @Resource(name = TenatService.BEAN_ID)
    private TenatService tenatService;
    public boolean isAuth(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpSession session = request.getSession();
        TenantSession tenantSession = (TenantSession) session.getAttribute(ContextAttributes.TENANT_SESSION);
        if (tenantSession == null) {
            return false;
        }
        LocalContext.getContext().setAttachment(ContextAttributes.SCHEMA, tenantSession.getSchema());
        return true;
    }
    /**
     *  //TODO 需要进一步完善逻辑
     *  租户登录授权
     * @param httpSession
     * @param tenantName
     * @return
     * @throws Exception
     */
    public boolean auth(HttpSession httpSession, String tenantName) throws Exception {
        //授权租户,切换到指定数据库,需要先清除原先的数据库指定,切回global_db表,获取租户信息
        LocalContext.getContext().removeAttachment(ContextAttributes.SCHEMA);
        TenantModel tenantModel = tenatService.findTenantByName(tenantName);
        //TODO:现在只是简单逻辑,需要修改成安全逻辑
        if (tenantModel == null ) {
            return false;
        }
        //切换Schema
        LocalContext.getContext().setAttachment(ContextAttributes.SCHEMA, tenantModel.getSchema());
//        UserModel userModel = userDao.findOne(user);
//        //TODO:现在只是简单逻辑,需要修改成安全逻辑
//        if (userModel == null || !password.equals(userModel.getPassword())) {
//            return "User Auth Failed";
//        }
        httpSession.setAttribute(ContextAttributes.TENANT_SESSION, new TenantSession(tenantModel.getName(), tenantModel.getSchema()));
        return true;
    }
    /**
     * 登出 - 移除租户授权信息
     * @param httpSession
     * @return
     * @throws Exception
     */
    public String logout(HttpSession httpSession) throws Exception {
        //移除Schema
        LocalContext.getContext().removeAttachment(ContextAttributes.SCHEMA);
        httpSession.removeAttribute(ContextAttributes.TENANT_SESSION);
        return "Tenan Logout Success";
    }
}

+ 31 - 0
src/main/java/com/yihu/hos/tenant/service/TenatService.java

@ -0,0 +1,31 @@
package com.yihu.hos.tenant.service;
import com.yihu.hos.tenant.dao.TenantDao;
import com.yihu.hos.tenant.model.TenantModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/12/2.
 */
@Service("TenatService")
public class TenatService {
    public static final String BEAN_ID = "TenatService";
    @Autowired
    private TenantDao tenantDao;
    public TenantModel findTenantByName(String name) throws Exception {
        List<TenantModel> list = tenantDao.getTenantList(name);
        if (list!=null && !list.isEmpty()){
            return list.get(0);
        }
        return null;
    }
}

+ 6 - 0
src/main/resources/application.yml

@ -20,6 +20,8 @@ spring:
---
spring:
  profiles: dev
  #SAAS管理员账号,暂时配置在此处
  administrators: jkzl
#  datasource:
#      driverClassName: com.mysql.jdbc.Driver
#      url: jdbc:mysql://192.168.1.220:3306/esb?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
@ -53,6 +55,8 @@ spring:
---
spring:
  profiles: test
  #SAAS管理员账号,暂时配置在此处
  administrators: jkzl
  data:
    mongodb:
      host: 172.19.103.86
@ -76,6 +80,8 @@ spring:
---
spring:
  #SAAS管理员账号,暂时配置在此处
  administrators: jkzl
  profiles: lfq
  data:
    mongodb:

+ 5 - 5
src/main/resources/spring/applicationContext.xml

@ -37,9 +37,9 @@
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://192.168.1.220:3306/esb?useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="hos2"/>
        <property name="password" value="hos2"/>
        <property name="url" value="jdbc:mysql://192.168.1.220:8066/global_db?useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="hos"/>
        <property name="password" value="123456"/>
        <property name="initialSize" value="1"/>
        <property name="maxTotal" value="100"/>
        <property name="maxIdle" value="50"/>
@ -61,13 +61,13 @@
        <property name="packagesToScan">
            <list>
                <!-- 可以加多个包 -->
                <value>com.yihu.hos.standard.model</value>
                <value>com.yihu.hos.*.model</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
                hibernate.show_sql=false
                hibernate.show_sql=true
                hibernate.format_sql=true
            </value>
        </property>

+ 38 - 1
src/main/webapp/WEB-INF/ehr/jsp/common/indexJs.jsp

@ -149,7 +149,8 @@
                            cache: false,
                            success: function (data) {
                                if (data.successFlg) {
                                    location.href = "${contextRoot}/loginPage";
                                    debugger
                                    location.href = "${contextRoot}/"+data.data+"/loginPage";
                                }
                                else {
                                    $.ligerDialog.error(data.message);
@ -384,6 +385,42 @@
    $(function () {
        if (window.history && window.history.pushState) {
            $(window).on('popstate', function () {
                var hashLocation = location.hash;
                var hashSplit = hashLocation.split("#!/");
                var hashName = hashSplit[1];
                if (hashName !== '') {
                    var hash = window.location.hash;
                    if (hash === '') {
                        $.ligerDialog.confirm('是否确认后退登出系统!', function (yes) {
                            if (yes) {
                                $.ajax({ //获取表的字段列表
                                    type: "POST",
                                    url: "${contextRoot}/system/logoutAction",
                                    dataType: "json",
                                    cache: false,
                                    success: function (data) {
                                        if (data.successFlg) {
                                            debugger
                                            location.href = "${contextRoot}/"+data.data+"/loginPage";
                                        }
                                        else {
                                            $.ligerDialog.error(data.message);
                                        }
                                    },
                                    error: function (data) {
                                        $.ligerDialog.error("Status:" + data.status + "(" + data.statusText + ")");
                                    }
                                });
                            }
                        });
                    }
                }
            });
            window.history.pushState('forward', null, './indexPage');
        }
        isLogin();
        indexPage.init();
    });