Просмотр исходного кода

Merge branch 'master' of http://49.234.186.218:9000/root/ieplus

mingfu 2 дней назад
Родитель
Сommit
15aa90e650

+ 112 - 5
ie-admin/src/main/java/com/ruoyi/web/service/SysLoginService.java

@@ -13,6 +13,8 @@ import com.ruoyi.dz.domain.DzCards;
 import com.ruoyi.dz.service.IDzCardsService;
 import com.ruoyi.dz.service.impl.DzCardsServiceImpl;
 import com.ruoyi.framework.web.service.TokenService;
+import com.ruoyi.system.domain.ZuserToken;
+import com.ruoyi.system.service.IZuserTokenService;
 import com.ruoyi.system.service.ShortMessageService;
 import com.ruoyi.web.controller.dz.DzCardsController;
 import org.apache.commons.collections4.CollectionUtils;
@@ -45,9 +47,8 @@ import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 登录校验方法
@@ -77,6 +78,10 @@ public class SysLoginService
     @Autowired
     private IDzCardsService cardsService;
 
+    @Autowired
+    private IZuserTokenService zuserTokenService;
+
+
     /**
      * 登录验证
      * @param mobile
@@ -162,13 +167,115 @@ public class SysLoginService
         }
         AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
-        recordLoginInfo(loginUser.getUserId());
+        Long userId = loginUser.getUserId();
+        recordLoginInfo(userId);
         // 生成token
         AjaxResult ajax = AjaxResult.success();
-        ajax.put(Constants.TOKEN, tokenService.createToken(loginUser));
+
+        //单点登录
+        resetTokensByUserIds(Arrays.asList(userId),true);
+
+        // 生成token
+        String token = tokenService.createToken(loginUser);
+
+        ZuserToken userToken = new ZuserToken();
+        userToken.setUserName(StringUtils.isEmpty(type)?username:(type+":"+username));
+        userToken.setUserId(userId);
+        userToken.setToken(token);
+        userToken.setUpdateTime(new Date());
+        zuserTokenService.insertZuserToken(userToken);
+
+        ajax.put(Constants.TOKEN, token);
+
         return ajax;
     }
 
+
+    /**
+     * 此处不使用resetTokens是为了与志愿保持一致
+     * 重置指定用户的登陆信息,强制重新登陆系统
+     * @param userIds
+     * @param isSso:适配志愿中锁分时也要清空用户token信息,此时设置为false,直接清空用户的token,设置为true就表示走单点登录的逻辑
+     * @param isSetSso:后台配置的单点登录配置,设置为true时启用单点登录,为false时不启用单点登录
+     * @return
+     */
+    public AjaxResult resetTokensByUserIds(List<Long> userIds,Boolean isSso) {
+        if (isSso){
+            String isSetSso = configService.selectConfigByKey( "is.set.sso");
+            if (StringUtils.isBlank(isSetSso)||!Boolean.valueOf(isSetSso)){
+                //参数配置的单点登录为false,此时不设置单点登录(将userids设置为空就不走清空流程),不需要清空用户已登录的token
+                userIds = new ArrayList<>();
+            }
+
+            Set<String> excludeUserIdSet=new HashSet<>();
+            String ssoWhiteListUserName = configService.selectConfigByKey("sso.white.list");
+            if(StringUtils.isNotBlank(ssoWhiteListUserName)){
+                Arrays.asList(ssoWhiteListUserName.split(",")).forEach(username->{
+                    excludeUserIdSet.add(username);
+                });
+            }
+            if (CollectionUtils.isNotEmpty(excludeUserIdSet)){
+                List<Long> excludeUserIds = userService.selectUsers(null,null,excludeUserIdSet).stream().map(SysUser::getUserId).collect(Collectors.toList());
+                //userIds减去excludeUserIds
+                // 将排除的用户ID转化为Set,以便高效查找
+                Set<Long> excludeSet = new HashSet<>(excludeUserIds);
+
+                // 使用Stream API过滤掉排除的用户ID
+                userIds = userIds.stream().filter(userId -> !excludeSet.contains(userId)).collect(Collectors.toList());
+            }
+        }
+        return resetTokensByUserIds(userIds);
+    }
+
+    /**
+     * 重置指定用户的登陆信息,强制重新登陆系统
+     * @param startUserList
+     * @return
+     */
+    public AjaxResult resetTokensByUserIds(List<Long> userIds) {
+        if(CollectionUtils.isEmpty(userIds)){
+            return AjaxResult.success();
+        }
+        ZuserToken zuserToken = new ZuserToken();
+        zuserToken.setUserIds(userIds);
+        List<ZuserToken> zuserTokenList = zuserTokenService.selectTopZuserTokenList(zuserToken);
+        for (ZuserToken zt : zuserTokenList) {
+            if(StringUtils.isNotNull(zt)){
+                tokenService.removeUserToken(zt.getToken());
+//                zuserTokenService.deleteZuserTokenById(zt.getId());
+            }
+        }
+        List<Long> tokenIdList = zuserTokenList.stream().map(ZuserToken::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+        Long[] tokenIds = tokenIdList.toArray(new Long[tokenIdList.size()]);
+        if(tokenIds.length>0){
+            zuserTokenService.deleteZuserTokenByIds(tokenIds);
+        }
+        return AjaxResult.success();
+    }
+
+    public AjaxResult resetTokens(List<SysUser> startUserList) {
+        List<Long> userIds = startUserList.stream().map(SysUser::getUserId).collect(Collectors.toList());
+        return resetTokensByUserIds(userIds);
+    }
+
+    /**
+     * 重置指定用户的登陆信息,强制重新登陆系统
+     * @param userName
+     * @return
+     */
+    public AjaxResult resetTokens(String userName) {
+        ZuserToken zuserToken = new ZuserToken();
+        zuserToken.setUserName(userName);
+        List<ZuserToken> zuserTokenList = zuserTokenService.selectTopZuserTokenList(zuserToken);
+        for (ZuserToken zt : zuserTokenList) {
+            if(StringUtils.isNotNull(zt)){
+                tokenService.removeUserToken(zt.getToken());
+                zuserTokenService.deleteZuserTokenById(zt.getId());
+            }
+        }
+        return AjaxResult.success();
+    }
+
     /**
      * 内部自动登陆,不记录日志
      * @param username

+ 8 - 0
ie-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java

@@ -93,6 +93,14 @@ public class TokenService
         }
     }
 
+
+    public void removeUserToken(String token) {
+        Claims claims = parseToken(token);
+        // 解析对应的权限以及用户信息
+        String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
+        delLoginUser(uuid);
+    }
+
     /**
      * 删除用户身份信息
      */

+ 90 - 0
ie-system/src/main/java/com/ruoyi/system/domain/ZuserToken.java

@@ -0,0 +1,90 @@
+package com.ruoyi.system.domain;
+
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.List;
+
+/**
+ * token对象 zuser_token
+ *
+ * @author mingxue
+ * @date 2021-06-15
+ */
+public class ZuserToken extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private Long id;
+
+    /** 用户ID */
+    @Excel(name = "用户ID")
+    private Long userId;
+    private List<Long> userIds;
+
+    /** 用户名 */
+    @Excel(name = "用户名")
+    private String userName;
+
+    /** token值 */
+    @Excel(name = "token值")
+    private String token;
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+    public void setUserName(String userName)
+    {
+        this.userName = userName;
+    }
+
+    public String getUserName()
+    {
+        return userName;
+    }
+    public void setToken(String token)
+    {
+        this.token = token;
+    }
+
+    public String getToken()
+    {
+        return token;
+    }
+
+    public List<Long> getUserIds() {
+        return userIds;
+    }
+
+    public void setUserIds(List<Long> userIds) {
+        this.userIds = userIds;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("userId", getUserId())
+            .append("userName", getUserName())
+            .append("token", getToken())
+            .toString();
+    }
+}

+ 3 - 0
ie-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java

@@ -3,6 +3,8 @@ package com.ruoyi.system.mapper;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+
 import org.apache.ibatis.annotations.Param;
 import com.ruoyi.common.core.domain.entity.SysUser;
 
@@ -77,6 +79,7 @@ public interface SysUserMapper
      * @return 结果
      */
     public int updateUser(SysUser user);
+    public List<SysUser> selectUsers(Map map);
 
     /**
      * 修改用户头像

+ 66 - 0
ie-system/src/main/java/com/ruoyi/system/mapper/ZuserTokenMapper.java

@@ -0,0 +1,66 @@
+package com.ruoyi.system.mapper;
+
+import com.ruoyi.system.domain.ZuserToken;
+
+import java.util.List;
+
+/**
+ * tokenMapper接口
+ *
+ * @author mingxue
+ * @date 2021-06-15
+ */
+public interface ZuserTokenMapper
+{
+    /**
+     * 查询token
+     *
+     * @param id tokenID
+     * @return token
+     */
+    public ZuserToken selectZuserTokenById(Integer id);
+
+    public ZuserToken selectZuserTokenByUserId(Long userId);
+
+    /**
+     * 查询token列表
+     *
+     * @param zuserToken token
+     * @return token集合
+     */
+    public List<ZuserToken> selectZuserTokenList(ZuserToken zuserToken);
+
+    public List<ZuserToken> selectTopZuserTokenList(ZuserToken zuserToken);
+
+    /**
+     * 新增token
+     *
+     * @param zuserToken token
+     * @return 结果
+     */
+    public int insertZuserToken(ZuserToken zuserToken);
+
+    /**
+     * 修改token
+     *
+     * @param zuserToken token
+     * @return 结果
+     */
+    public int updateZuserToken(ZuserToken zuserToken);
+
+    /**
+     * 删除token
+     *
+     * @param id tokenID
+     * @return 结果
+     */
+    public int deleteZuserTokenById(Long id);
+
+    /**
+     * 批量删除token
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    public int deleteZuserTokenByIds(Long[] ids);
+}

+ 1 - 0
ie-system/src/main/java/com/ruoyi/system/service/ISysUserService.java

@@ -161,6 +161,7 @@ public interface ISysUserService
      * @return 结果
      */
     public int updateUserProfile(SysUser user);
+    public List<SysUser> selectUsers(Collection<Long> userIds, Collection<String> codes, Collection<String> userNames);
 
     /**
      * 修改用户头像

+ 66 - 0
ie-system/src/main/java/com/ruoyi/system/service/IZuserTokenService.java

@@ -0,0 +1,66 @@
+package com.ruoyi.system.service;
+
+import com.ruoyi.system.domain.ZuserToken;
+
+import java.util.List;
+
+/**
+ * tokenService接口
+ *
+ * @author mingxue
+ * @date 2021-06-15
+ */
+public interface IZuserTokenService
+{
+    /**
+     * 查询token
+     *
+     * @param id tokenID
+     * @return token
+     */
+    public ZuserToken selectZuserTokenById(Integer id);
+
+    public ZuserToken selectZuserTokenByUserId(Long userId);
+
+    /**
+     * 查询token列表
+     *
+     * @param zuserToken token
+     * @return token集合
+     */
+    public List<ZuserToken> selectZuserTokenList(ZuserToken zuserToken);
+
+    public List<ZuserToken> selectTopZuserTokenList(ZuserToken zuserToken);
+
+    /**
+     * 新增token
+     *
+     * @param zuserToken token
+     * @return 结果
+     */
+    public int insertZuserToken(ZuserToken zuserToken);
+
+    /**
+     * 修改token
+     *
+     * @param zuserToken token
+     * @return 结果
+     */
+    public int updateZuserToken(ZuserToken zuserToken);
+
+    /**
+     * 批量删除token
+     *
+     * @param ids 需要删除的tokenID
+     * @return 结果
+     */
+    public int deleteZuserTokenByIds(Long[] ids);
+
+    /**
+     * 删除token信息
+     *
+     * @param id tokenID
+     * @return 结果
+     */
+    public int deleteZuserTokenById(Long id);
+}

+ 18 - 5
ie-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java

@@ -1,13 +1,12 @@
 package com.ruoyi.system.service.impl;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 import javax.validation.Validator;
 
 import cn.hutool.core.util.RandomUtil;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.ruoyi.enums.UserTypeEnum;
 import com.ruoyi.system.service.ISysRoleService;
 import org.slf4j.Logger;
@@ -15,7 +14,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import com.ruoyi.common.annotation.DataScope;
 import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.entity.SysRole;
@@ -615,4 +614,18 @@ public class SysUserServiceImpl implements ISysUserService
         insertUser(user);
         return user.getUserId();
     }
+
+    public List<SysUser> selectUsers(Collection<Long> userIds, Collection<String> codes, Collection<String> userNames) {
+        Map cond = Maps.newHashMap();
+        if (CollectionUtils.isNotEmpty(userIds) && (!userIds.remove(null) || userIds.size() > 0)) {
+            cond.put("userIds", userIds);
+        }
+        if (CollectionUtils.isNotEmpty(codes) && (!codes.remove(null) || codes.size() > 0)) {
+            cond.put("codes", codes);
+        }
+        if (CollectionUtils.isNotEmpty(userNames) && (!userNames.remove(null) || userNames.size() > 0)) {
+            cond.put("userNames", userNames);
+        }
+        return cond.size() == 0 ? Lists.newArrayList() : userMapper.selectUsers(cond);
+    }
 }

+ 107 - 0
ie-system/src/main/java/com/ruoyi/system/service/impl/ZuserTokenServiceImpl.java

@@ -0,0 +1,107 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.common.annotation.DataSource;
+import com.ruoyi.common.enums.DataSourceType;
+import com.ruoyi.system.domain.ZuserToken;
+import com.ruoyi.system.mapper.ZuserTokenMapper;
+import com.ruoyi.system.service.IZuserTokenService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * tokenService业务层处理
+ *
+ * @author mingxue
+ * @date 2021-06-15
+ */
+@Service
+@DataSource(DataSourceType.MASTER)
+public class ZuserTokenServiceImpl implements IZuserTokenService
+{
+    @Autowired
+    private ZuserTokenMapper zuserTokenMapper;
+
+    /**
+     * 查询token
+     *
+     * @param id tokenID
+     * @return token
+     */
+    @Override
+    public ZuserToken selectZuserTokenById(Integer id)
+    {
+        return zuserTokenMapper.selectZuserTokenById(id);
+    }
+
+    @Override
+    public ZuserToken selectZuserTokenByUserId(Long userId) {
+        return zuserTokenMapper.selectZuserTokenByUserId(userId);
+    }
+
+    /**
+     * 查询token列表
+     *
+     * @param zuserToken token
+     * @return token
+     */
+    @Override
+    public List<ZuserToken> selectZuserTokenList(ZuserToken zuserToken)
+    {
+        return zuserTokenMapper.selectZuserTokenList(zuserToken);
+    }
+
+    @Override
+    public List<ZuserToken> selectTopZuserTokenList(ZuserToken zuserToken) {
+        return zuserTokenMapper.selectTopZuserTokenList(zuserToken);
+    }
+
+    /**
+     * 新增token
+     *
+     * @param zuserToken token
+     * @return 结果
+     */
+    @Override
+    public int insertZuserToken(ZuserToken zuserToken)
+    {
+        return zuserTokenMapper.insertZuserToken(zuserToken);
+    }
+
+    /**
+     * 修改token
+     *
+     * @param zuserToken token
+     * @return 结果
+     */
+    @Override
+    public int updateZuserToken(ZuserToken zuserToken)
+    {
+        return zuserTokenMapper.updateZuserToken(zuserToken);
+    }
+
+    /**
+     * 批量删除token
+     *
+     * @param ids 需要删除的tokenID
+     * @return 结果
+     */
+    @Override
+    public int deleteZuserTokenByIds(Long[] ids)
+    {
+        return zuserTokenMapper.deleteZuserTokenByIds(ids);
+    }
+
+    /**
+     * 删除token信息
+     *
+     * @param id tokenID
+     * @return 结果
+     */
+    @Override
+    public int deleteZuserTokenById(Long id)
+    {
+        return zuserTokenMapper.deleteZuserTokenById(id);
+    }
+}

+ 9 - 0
ie-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -171,6 +171,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
 	</select>
 
+	<select id="selectUsers" parameterType="map" resultMap="SysUserResult">
+		select user_id, dept_id, nick_name, avatar, user_name, email,exam_type from sys_user
+		<where>
+			<if test="codes != null"> AND code IN <foreach collection="codes" item="v" open="(" separator="," close=")">#{v}</foreach> </if>
+			<if test="userNames != null"> AND user_name IN <foreach collection="userNames" item="v" open="(" separator="," close=")">#{v}</foreach> </if>
+			<if test="userIds != null">AND user_id IN <foreach collection="userIds" item="v" open="(" separator="," close=")">#{v}</foreach> </if>
+		</where>
+	</select>
+
 	<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
  		insert into sys_user(
  			<if test="userId != null and userId != 0">user_id,</if>

+ 88 - 0
ie-system/src/main/resources/mapper/system/ZuserTokenMapper.xml

@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.ZuserTokenMapper">
+
+    <resultMap type="ZuserToken" id="ZuserTokenResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="userName"    column="user_name"    />
+        <result property="token"    column="token"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectZuserTokenVo">
+        select id, user_id, user_name, token, update_time from zuser_token
+    </sql>
+
+    <select id="selectZuserTokenList" parameterType="ZuserToken" resultMap="ZuserTokenResult">
+        <include refid="selectZuserTokenVo"/>
+        <where>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="updateTime != null "> and update_time = #{updateTime}</if>
+            <if test="userName != null  and userName != ''"> and user_name like concat('%', #{userName}, '%')</if>
+            <if test="token != null  and token != ''"> and token = #{token}</if>
+        </where>
+    </select>
+
+    <select id="selectTopZuserTokenList" parameterType="ZuserToken" resultMap="ZuserTokenResult">
+        <include refid="selectZuserTokenVo"/>
+        <where>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="updateTime != null "> and update_time = #{updateTime}</if>
+            <if test="userName != null  and userName != ''"> and user_name like concat('%', #{userName}, '%')</if>
+            <if test="token != null  and token != ''"> and token = #{token}</if>
+            <if test="userIds != null"> and user_id in <foreach item="userId" collection="userIds" open="(" separator="," close=")">#{userId}</foreach></if>
+        </where>
+        order by id desc
+    </select>
+
+    <select id="selectZuserTokenById" parameterType="Integer" resultMap="ZuserTokenResult">
+        <include refid="selectZuserTokenVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectZuserTokenByUserId" parameterType="Long" resultMap="ZuserTokenResult">
+        <include refid="selectZuserTokenVo"/>
+        where user_id = #{userId}
+    </select>
+
+    <insert id="insertZuserToken" parameterType="ZuserToken" useGeneratedKeys="true" keyProperty="id">
+        insert into zuser_token
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="userName != null">user_name,</if>
+            <if test="token != null">token,</if>
+            <if test="updateTime != null">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="userName != null">#{userName},</if>
+            <if test="token != null">#{token},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateZuserToken" parameterType="ZuserToken">
+        update zuser_token
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="userName != null">user_name = #{userName},</if>
+            <if test="token != null">token = #{token},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteZuserTokenById" parameterType="Long">
+        delete from zuser_token where id = #{id}
+    </delete>
+
+    <delete id="deleteZuserTokenByIds" parameterType="String">
+        delete from zuser_token where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>