wangwei 7 سال پیش
والد
کامیت
fdad494bb0

+ 46 - 0
examcloud-core-basic-api-provider/src/main/java/cn/com/qmth/examcloud/service/core/api/AuthController.java

@@ -0,0 +1,46 @@
+package cn.com.qmth.examcloud.service.core.api;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.com.qmth.examcloud.commons.base.exception.StatusException;
+import cn.com.qmth.examcloud.commons.web.security.bean.User;
+import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
+import cn.com.qmth.examcloud.core.basic.service.AuthService;
+import cn.com.qmth.examcloud.core.basic.service.bean.LoginInfo;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * 鉴权
+ *
+ * @author WANGWEI
+ * @date 2018年5月25日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@RestController
+@RequestMapping("${app.api.root}/" + "auth")
+public class AuthController extends ControllerSupport {
+
+	@Autowired
+	AuthService authService;
+
+	@ApiOperation(value = "登入", notes = "")
+	@PostMapping("login")
+	public User login(@RequestBody LoginInfo loginInfo) {
+		User user = authService.login(loginInfo);
+		return user;
+	}
+
+	@ApiOperation(value = "登出", notes = "")
+	@PostMapping("logout")
+	public void logout() {
+		User user = getAccessUser();
+		if (null == user) {
+			throw new StatusException("P-001001", "用户已登出");
+		}
+		authService.logout(user);
+	}
+}

+ 26 - 0
examcloud-core-basic-service/src/main/java/cn/com/qmth/examcloud/core/basic/service/AuthService.java

@@ -0,0 +1,26 @@
+package cn.com.qmth.examcloud.core.basic.service;
+
+import cn.com.qmth.examcloud.commons.web.security.bean.User;
+import cn.com.qmth.examcloud.core.basic.service.bean.LoginInfo;
+
+/**
+ * 鉴权
+ *
+ * @author WANGWEI
+ * @date 2018年5月25日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+public interface AuthService {
+
+	/**
+	 * 登录
+	 *
+	 * @author WANGWEI
+	 * @param loginInfo
+	 * @return
+	 */
+	User login(LoginInfo loginInfo);
+
+	void logout(User user);
+
+}

+ 80 - 0
examcloud-core-basic-service/src/main/java/cn/com/qmth/examcloud/core/basic/service/bean/LoginInfo.java

@@ -0,0 +1,80 @@
+package cn.com.qmth.examcloud.core.basic.service.bean;
+
+import java.io.Serializable;
+
+/**
+ * 登陆信息
+ * 
+ * @author WANGWEI
+ *
+ */
+public class LoginInfo implements Serializable {
+
+	private static final long serialVersionUID = 1305354276321732681L;
+
+	/**
+	 * 顶级机构ID
+	 */
+	private String rootOrgId;
+
+	/**
+	 * 域名
+	 */
+	private String domain;
+
+	/**
+	 * 登陆账号类型
+	 */
+	private String accountType;
+
+	/**
+	 * 登陆账号值
+	 */
+	private String accountValue;
+
+	/**
+	 * 密码
+	 */
+	private String password;
+
+	public String getRootOrgId() {
+		return rootOrgId;
+	}
+
+	public void setRootOrgId(String rootOrgId) {
+		this.rootOrgId = rootOrgId;
+	}
+
+	public String getDomain() {
+		return domain;
+	}
+
+	public void setDomain(String domain) {
+		this.domain = domain;
+	}
+
+	public String getAccountType() {
+		return accountType;
+	}
+
+	public void setAccountType(String accountType) {
+		this.accountType = accountType;
+	}
+
+	public String getAccountValue() {
+		return accountValue;
+	}
+
+	public void setAccountValue(String accountValue) {
+		this.accountValue = accountValue;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+}

+ 120 - 0
examcloud-core-basic-service/src/main/java/cn/com/qmth/examcloud/core/basic/service/impl/AuthServiceImpl.java

@@ -0,0 +1,120 @@
+package cn.com.qmth.examcloud.core.basic.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.google.common.collect.Lists;
+
+import cn.com.qmth.examcloud.commons.base.exception.StatusException;
+import cn.com.qmth.examcloud.commons.base.util.UUID;
+import cn.com.qmth.examcloud.commons.web.redis.RedisClient;
+import cn.com.qmth.examcloud.commons.web.security.bean.Role;
+import cn.com.qmth.examcloud.commons.web.security.bean.User;
+import cn.com.qmth.examcloud.commons.web.support.ResponseStatus;
+import cn.com.qmth.examcloud.core.basic.api.UserCloudService;
+import cn.com.qmth.examcloud.core.basic.api.bean.RoleBean;
+import cn.com.qmth.examcloud.core.basic.api.bean.UserBean;
+import cn.com.qmth.examcloud.core.basic.api.request.LoginReq;
+import cn.com.qmth.examcloud.core.basic.api.response.LoginResp;
+import cn.com.qmth.examcloud.core.basic.service.AuthService;
+import cn.com.qmth.examcloud.core.basic.service.bean.LoginInfo;
+
+/**
+ * 类注释
+ *
+ * @author WANGWEI
+ * @date 2018年5月25日
+ * @Copyright (c) 2018-? http://qmth.com.cn All Rights Reserved.
+ */
+@Service
+public class AuthServiceImpl implements AuthService {
+
+	@Autowired
+	RedisClient redisClient;
+
+	@Autowired
+	UserCloudService userCloudService;
+
+	@Override
+	public User login(LoginInfo loginInfo) {
+		LoginReq loginReq = new LoginReq();
+		loginReq.setAccountType(loginInfo.getAccountType());
+		loginReq.setAccountValue(loginInfo.getAccountValue());
+		loginReq.setRootOrgId(loginInfo.getRootOrgId());
+		loginReq.setDomain(loginInfo.getDomain());
+		loginReq.setPassword(loginInfo.getPassword());
+		LoginResp loginResp = null;
+		try {
+			loginResp = userCloudService.login(loginReq);
+		} catch (StatusException e) {
+			if (e.getCode().equals(ResponseStatus.SERVER_ERROR.getCode())) {
+				throw e;
+			} else {
+				throw new StatusException("P-001001", "用户名或密码错误", e);
+			}
+		}
+		UserBean userBean = loginResp.getUserBean();
+
+		User user = new User();
+		List<Role> roleList = Lists.newArrayList();
+		user.setRoleList(roleList);
+
+		user.setUserType(userBean.getUserType());
+		user.setUserId(userBean.getUserId());
+		user.setDisplayName(userBean.getDisplayName());
+		user.setRootOrgId(userBean.getRootOrgId());
+		user.setRootOrgName(userBean.getRootOrgName());
+		user.setOrgId(userBean.getOrgId());
+		user.setOrgName(userBean.getOrgName());
+		user.setIdentityNumber(userBean.getIdentityNumber());
+		user.setStudentCode(userBean.getStudentCode());
+
+		List<RoleBean> roleBeanList = userBean.getRoleList();
+
+		if (CollectionUtils.isNotEmpty(roleBeanList)) {
+			for (RoleBean cur : roleBeanList) {
+				Role role = new Role();
+				role.setRoleCode(cur.getRoleCode());
+				role.setRoleName(cur.getRoleName());
+				roleList.add(role);
+			}
+		}
+
+		user.setTokenCreationTime(new Date());
+		user.setToken(UUID.randomUUID());
+
+		String key = buildUserKey(user.getUserType(), user.getRootOrgId(), user.getUserId());
+		user.setKey(key);
+		user.setUserToken(key+":"+user.getToken());
+
+		redisClient.set(key, user, 2 * 60 * 60);
+
+		return user;
+	}
+
+	/**
+	 * 构建key
+	 *
+	 * @author WANGWEI
+	 * @param userType
+	 * @param rootOrgId
+	 * @param userId
+	 * @return
+	 */
+	private String buildUserKey(String userType, Long rootOrgId, Long userId) {
+		String key = StringUtils.join("U_", userType, "_", String.valueOf(rootOrgId), "_",
+				String.valueOf(userId));
+		return key;
+	}
+
+	@Override
+	public void logout(User user) {
+		redisClient.delete(user.getKey());
+	}
+
+}