Browse Source

增加单点登录

宋悦 8 years ago
parent
commit
edefadf814

+ 14 - 0
core-api/src/main/java/cn/com/qmth/examcloud/service/core/api/UserApi.java

@@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.ModelAttribute;
@@ -210,4 +211,17 @@ public class UserApi {
         AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
         return new ResponseEntity(userService.getMarker(accessUser.getRootOrgId()), HttpStatus.OK);
     }
+
+    @ApiOperation(value="校验token",notes="校验token")
+    @GetMapping("/checkToken")
+    public ResponseEntity checkToken(HttpServletRequest request){
+        AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
+        if(accessUser == null){
+            return new ResponseEntity(HttpStatus.NOT_FOUND);
+        }else if(StringUtils.isEmpty(accessUser.getToken())){
+            return new ResponseEntity(HttpStatus.NOT_FOUND);
+        }else{
+            return new ResponseEntity(HttpStatus.OK);
+        }
+    }
 }

+ 46 - 5
core-api/src/main/java/cn/com/qmth/examcloud/service/core/service/UserService.java

@@ -9,6 +9,10 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import cn.com.qmth.examcloud.common.uac.enums.RoleMeta;
+import cn.com.qmth.examcloud.service.core.entity.*;
+import cn.com.qmth.examcloud.service.core.repo.*;
+import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Example;
@@ -22,10 +26,6 @@ import cn.com.qmth.examcloud.common.uac.entity.AccessUser;
 import cn.com.qmth.examcloud.common.uac.enums.RoleMeta;
 import cn.com.qmth.examcloud.common.util.RedisUtil;
 import cn.com.qmth.examcloud.service.core.dto.UserInfo;
-import cn.com.qmth.examcloud.service.core.entity.Org;
-import cn.com.qmth.examcloud.service.core.entity.Student;
-import cn.com.qmth.examcloud.service.core.entity.User;
-import cn.com.qmth.examcloud.service.core.entity.UserRole;
 import cn.com.qmth.examcloud.service.core.enums.UserType;
 import cn.com.qmth.examcloud.service.core.params.UserParam;
 import cn.com.qmth.examcloud.service.core.repo.OrgRepo;
@@ -52,6 +52,9 @@ public class UserService {
     @Autowired
     UserRoleRepo userRoleRepo;
 
+    @Autowired
+    UserLoginRepo userLoginRepo;
+
     public Page<User> findAll(User userCriteria, Pageable pageable){
         ExampleMatcher exampleMatcher = ExampleMatcher.matching()
                 .withMatcher("name", contains())
@@ -75,7 +78,11 @@ public class UserService {
         }else if(user.getType() == UserType.STUDENT){
             //截取身份证后6位为学生登录密码
             Student student = studentRepo.findByUserId(userId);
-            user.setPassword(StringUtils.substring(student.getIdentityNumber(),-6,-1));
+            if(StringUtils.isNotEmpty(student.getIdentityNumber())){
+                user.setPassword(StringUtils.substring(student.getIdentityNumber(),-6,-1));
+            }else{
+                user.setPassword(UserParam.DEFAULT_PASSWORD);
+            }
         }
         user.setUpdateTime(new Date());
         userRepo.save(user);
@@ -123,12 +130,40 @@ public class UserService {
         }else if(!user.getEnable()){
             throw new RuntimeException("该用户被禁用");
         }else{
+            initUserLogin(user);
             String token = AccessCtrlUtil.buildToken();
             createAccessUser(token,user,null);
+            createUserLogin(token,user);
             return getUserInfo(user,token);
         }
     }
 
+    /**
+     * 初始化用户登录
+     * @param user
+     */
+    public void initUserLogin(User user){
+        //判断是否已登录,若已登录则强制已登录用户退出
+        UserLogin userLogin= userLoginRepo.findFirstByUserId(user.getId());
+        if(userLogin != null){
+            RedisUtil.deleteByte(userLogin.getToken());
+            userLoginRepo.deleteByUserId(userLogin.getUserId());
+        }
+    }
+
+    /**
+     * 创建用户登录记录
+     * @param token
+     * @param user
+     */
+    public void createUserLogin(String token,User user){
+        UserLogin userLogin = new UserLogin();
+        userLogin.setLoginTime(new Date());
+        userLogin.setUserId(user.getId());
+        userLogin.setToken(token);
+        userLoginRepo.save(userLogin);
+    }
+
     /**
      * 创建访问用户并加入K/V缓存
      * @param token
@@ -177,6 +212,11 @@ public class UserService {
         return userInfo;
     }
 
+    /**
+     * 获取角色名称
+     * @param userRoles
+     * @return
+     */
     public List<String> getRoleNames(List<UserRole> userRoles){
 
         List<String> roleNameList = userRoles.stream()
@@ -192,6 +232,7 @@ public class UserService {
      */
 	public void logout(AccessUser accessUser) {
 		RedisUtil.deleteByte(accessUser.getToken());
+        userLoginRepo.deleteByUserId(accessUser.getUserId());
 	}
 
 	public List<User> getMarker(Long rootOrgId) {

+ 73 - 0
core-domain/src/main/java/cn/com/qmth/examcloud/service/core/entity/UserLogin.java

@@ -0,0 +1,73 @@
+package cn.com.qmth.examcloud.service.core.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Created by songyue on 17/5/18.
+ */
+@Entity
+@Table(name = "ecs_core_user_login")
+public class UserLogin implements Serializable{
+    private static final long serialVersionUID = 4931722046427053540L;
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    private Long userId;
+
+    private Date loginTime;
+
+    private String ipAddress;
+
+    private String token;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Date getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(Date loginTime) {
+        this.loginTime = loginTime;
+    }
+
+    public String getIpAddress() {
+        return ipAddress;
+    }
+
+    public void setIpAddress(String ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+}

+ 18 - 0
core-domain/src/main/java/cn/com/qmth/examcloud/service/core/repo/UserLoginRepo.java

@@ -0,0 +1,18 @@
+package cn.com.qmth.examcloud.service.core.repo;
+
+import cn.com.qmth.examcloud.service.core.entity.UserLogin;
+import cn.com.qmth.examcloud.service.core.entity.UserRole;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.repository.query.QueryByExampleExecutor;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Created by songyue on 17/2/22.
+ */
+public interface UserLoginRepo extends JpaRepository<UserLogin,Long>,QueryByExampleExecutor<UserLogin> {
+
+    UserLogin findFirstByUserId(Long userId);
+
+    @Transactional
+    void deleteByUserId(Long userId);
+}