Compare commits
4 Commits
Author | SHA1 | Date |
---|---|---|
|
80302ded05 | |
|
2f5edc5abe | |
|
171b885a2a | |
|
d49321a37b |
|
@ -34,7 +34,7 @@ public class TokenController {
|
|||
@PostMapping("login")
|
||||
public Result<?> login (@RequestBody LoginBody form) {
|
||||
// 用户登录
|
||||
LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword());
|
||||
LoginUser userInfo = sysLoginService.login(form);
|
||||
// 获取登录token
|
||||
return Result.success(tokenService.createToken(userInfo));
|
||||
}
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
package com.muyu.auth.form;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 用户登录对象
|
||||
*
|
||||
* @author muyu
|
||||
*/
|
||||
@Data
|
||||
public class LoginBody {
|
||||
/**
|
||||
* 用户名
|
||||
|
@ -15,20 +18,4 @@ public class LoginBody {
|
|||
* 用户密码
|
||||
*/
|
||||
private String password;
|
||||
|
||||
public String getUsername () {
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setUsername (String username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public String getPassword () {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword (String password) {
|
||||
this.password = password;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.muyu.auth.service;
|
||||
|
||||
import com.muyu.auth.form.LoginBody;
|
||||
import com.muyu.common.core.constant.CacheConstants;
|
||||
import com.muyu.common.core.constant.Constants;
|
||||
import com.muyu.common.core.constant.SecurityConstants;
|
||||
|
@ -18,6 +19,9 @@ import com.muyu.common.system.domain.LoginUser;
|
|||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* 登录校验方法
|
||||
*
|
||||
|
@ -40,36 +44,36 @@ public class SysLoginService {
|
|||
/**
|
||||
* 登录
|
||||
*/
|
||||
public LoginUser login (String username, String password) {
|
||||
public LoginUser login (LoginBody form) {
|
||||
// 用户名或密码为空 错误
|
||||
if (StringUtils.isAnyBlank(username, password)) {
|
||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户/密码必须填写");
|
||||
throw new ServiceException("用户/密码必须填写");
|
||||
if (StringUtils.isAnyBlank(form.getUsername(), form.getPassword())) {
|
||||
recordLogService.recordLogininfor(form.getUsername(), Constants.LOGIN_FAIL, "用户/邮箱/密码必须填写");
|
||||
throw new ServiceException("用户/邮箱/密码必须填写");
|
||||
}
|
||||
// 密码如果不在指定范围内 错误
|
||||
if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
|
||||
|| password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
|
||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户密码不在指定范围");
|
||||
if (form.getPassword().length() < UserConstants.PASSWORD_MIN_LENGTH
|
||||
|| form.getPassword().length() > UserConstants.PASSWORD_MAX_LENGTH) {
|
||||
recordLogService.recordLogininfor(form.getUsername(), Constants.LOGIN_FAIL, "用户密码不在指定范围");
|
||||
throw new ServiceException("用户密码不在指定范围");
|
||||
}
|
||||
// 用户名不在指定范围内 错误
|
||||
if (username.length() < UserConstants.USERNAME_MIN_LENGTH
|
||||
|| username.length() > UserConstants.USERNAME_MAX_LENGTH) {
|
||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户名不在指定范围");
|
||||
if (form.getUsername().length() < UserConstants.USERNAME_MIN_LENGTH
|
||||
|| form.getUsername().length() > UserConstants.USERNAME_MAX_LENGTH) {
|
||||
recordLogService.recordLogininfor(form.getUsername(), Constants.LOGIN_FAIL, "用户名不在指定范围");
|
||||
throw new ServiceException("用户名不在指定范围");
|
||||
}
|
||||
// IP黑名单校验
|
||||
String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST));
|
||||
if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) {
|
||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "很遗憾,访问IP已被列入系统黑名单");
|
||||
recordLogService.recordLogininfor(form.getUsername(), Constants.LOGIN_FAIL, "很遗憾,访问IP已被列入系统黑名单");
|
||||
throw new ServiceException("很遗憾,访问IP已被列入系统黑名单");
|
||||
}
|
||||
// 查询用户信息
|
||||
Result<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
|
||||
Result<LoginUser> userResult = remoteUserService.getUserInfo(form.getUsername(), SecurityConstants.INNER);
|
||||
|
||||
if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) {
|
||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在");
|
||||
throw new ServiceException("登录用户:" + username + " 不存在");
|
||||
recordLogService.recordLogininfor(form.getUsername(), Constants.LOGIN_FAIL, "登录用户不存在");
|
||||
throw new ServiceException("登录用户:" + form.getUsername() + " 不存在");
|
||||
}
|
||||
|
||||
if (Result.FAIL == userResult.getCode()) {
|
||||
|
@ -79,15 +83,15 @@ public class SysLoginService {
|
|||
LoginUser userInfo = userResult.getData();
|
||||
SysUser user = userResult.getData().getSysUser();
|
||||
if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
|
||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
|
||||
throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
|
||||
recordLogService.recordLogininfor(form.getUsername(), Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
|
||||
throw new ServiceException("对不起,您的账号:" + form.getUsername() + " 已被删除");
|
||||
}
|
||||
if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
|
||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
|
||||
throw new ServiceException("对不起,您的账号:" + username + " 已停用");
|
||||
recordLogService.recordLogininfor(form.getUsername(), Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
|
||||
throw new ServiceException("对不起,您的账号:" + form.getUsername() + " 已停用");
|
||||
}
|
||||
passwordService.validate(user, password);
|
||||
recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功");
|
||||
passwordService.validate(user, form.getPassword());
|
||||
recordLogService.recordLogininfor(form.getUsername(), Constants.LOGIN_SUCCESS, "登录成功");
|
||||
return userInfo;
|
||||
}
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@ import com.muyu.common.security.annotation.RequiresPermissions;
|
|||
import com.muyu.common.system.domain.LoginUser;
|
||||
import com.muyu.system.domain.SysUserOnline;
|
||||
import com.muyu.system.service.SysUserOnlineService;
|
||||
import lombok.extern.log4j.Log4j2;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
|
@ -27,6 +28,7 @@ import java.util.List;
|
|||
*/
|
||||
@RestController
|
||||
@RequestMapping("/online")
|
||||
@Log4j2
|
||||
public class SysUserOnlineController extends BaseController {
|
||||
@Autowired
|
||||
private SysUserOnlineService userOnlineService;
|
||||
|
@ -63,6 +65,7 @@ public class SysUserOnlineController extends BaseController {
|
|||
@Log(title = "在线用户", businessType = BusinessType.FORCE)
|
||||
@DeleteMapping("/{tokenId}")
|
||||
public Result forceLogout (@PathVariable String tokenId) {
|
||||
log.info("被强制下线的用户的tokenId:{}",tokenId);
|
||||
redisService.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
|
||||
return success();
|
||||
}
|
||||
|
|
|
@ -135,4 +135,18 @@ public interface SysMenuMapper extends BaseMapper<SysMenu> {
|
|||
* @return 结果
|
||||
*/
|
||||
public SysMenu checkMenuNameUnique (@Param("menuName") String menuName, @Param("parentId") Long parentId);
|
||||
|
||||
/**
|
||||
* 通过ID列表查询系统菜单列表。
|
||||
* @param longList 需要查询的菜单ID列表,类型为List<Long>。
|
||||
* @return 返回一个SysMenu类型的菜单列表,包含所有指定ID的菜单项。
|
||||
*/
|
||||
List<SysMenu> selectSysMenuList(@Param("longList") List<Long> longList);
|
||||
|
||||
/**
|
||||
* 通过ID列表查询系统菜单的子菜单列表。
|
||||
* @param longList 需要查询子菜单的菜单ID列表,类型为List<Long>。
|
||||
* @return 返回一个SysMenu类型的子菜单列表,包含所有指定菜单ID下的子菜单项。
|
||||
*/
|
||||
List<SysMenu> selectSysChildrenList(@Param("longList") List<Long> longList);
|
||||
}
|
||||
|
|
|
@ -51,6 +51,60 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
|||
return selectMenuList(new SysMenu(), userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归查询菜单列表
|
||||
* @param sysMenuList 待处理的菜单列表
|
||||
* @return 返回处理后的菜单列表,如果不存在父菜单不是0的菜单则返回null
|
||||
*/
|
||||
public List<SysMenu> selectMenuList (List<SysMenu> sysMenuList) {
|
||||
// 从给定的菜单列表中,筛选出所有父菜单ID不为0的ID,并去重
|
||||
List<Long> longList = sysMenuList.stream()
|
||||
.map(SysMenu::getParentId)
|
||||
.filter(parentId -> parentId != 0)
|
||||
.distinct()
|
||||
.toList();
|
||||
// 如果筛选后的列表为空,则表示没有需要处理的菜单,直接返回null
|
||||
if(longList.isEmpty()){
|
||||
return null;
|
||||
}
|
||||
// 根据筛选出的父菜单ID列表,查询相应的菜单信息
|
||||
List<SysMenu> sysMenus = menuMapper.selectSysMenuList(longList);
|
||||
// 递归调用,查询这些菜单的子菜单
|
||||
List<SysMenu> sysMenus1 = selectMenuList(sysMenus);
|
||||
// 如果递归查询到了子菜单,则将其添加到主菜单列表中
|
||||
if(sysMenus1 != null){
|
||||
sysMenus.addAll(sysMenus1);
|
||||
}
|
||||
return sysMenus;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询系统菜单的子菜单列表。
|
||||
*
|
||||
* @param sysMenuList 父级菜单列表,通过这些父级菜单ID来查询它们的子菜单。
|
||||
* @return 返回子菜单列表,如果不存在子菜单则返回null。
|
||||
*/
|
||||
public List<SysMenu> selectSysChildrenList (List<SysMenu> sysMenuList) {
|
||||
// 将父级菜单列表转换为菜单ID列表
|
||||
List<Long> longList = sysMenuList.stream()
|
||||
.map(SysMenu::getMenuId)
|
||||
.toList();
|
||||
// 根据菜单ID列表查询子菜单列表
|
||||
List<SysMenu> sysMenus = menuMapper.selectSysChildrenList(longList);
|
||||
if(sysMenus != null && !sysMenus.isEmpty()){
|
||||
// 递归查询子菜单的子菜单
|
||||
List<SysMenu> sysMenus1 = selectMenuList(sysMenus);
|
||||
if(sysMenus1 != null){
|
||||
// 将查询到的子菜单添加到原子菜单列表中
|
||||
sysMenus.addAll(sysMenus1);
|
||||
}
|
||||
}else {
|
||||
// 如果没有查询到子菜单,则返回null
|
||||
return null;
|
||||
}
|
||||
return sysMenus;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询系统菜单列表
|
||||
*
|
||||
|
@ -58,19 +112,42 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
|
|||
*
|
||||
* @return 菜单列表
|
||||
*/
|
||||
/**
|
||||
* 根据用户权限查询菜单列表
|
||||
* @param menu 菜单实体,用于查询条件
|
||||
* @param userId 用户ID,用于判断用户权限
|
||||
* @return 返回不重复的菜单列表
|
||||
*/
|
||||
@Override
|
||||
public List<SysMenu> selectMenuList (SysMenu menu, Long userId) {
|
||||
List<SysMenu> menuList = null;
|
||||
// 管理员显示所有菜单信息
|
||||
if (SysUser.isAdmin(userId)) {
|
||||
// 判断是否为管理员,管理员显示所有菜单信息
|
||||
if(SysUser.isAdmin(userId)){
|
||||
// 查询所有菜单
|
||||
menuList = menuMapper.selectMenuList(menu);
|
||||
} else {
|
||||
menu.getParams().put("userId", userId);
|
||||
// 通过递归查询所有子菜单
|
||||
List<SysMenu> sysMenus = selectMenuList(menuList);
|
||||
if(sysMenus != null && !sysMenus.isEmpty()){
|
||||
menuList.addAll(sysMenus);
|
||||
}
|
||||
// 查询直接子菜单
|
||||
List<SysMenu> sysMenus1 = selectSysChildrenList(menuMapper.selectMenuList(menu));
|
||||
if(sysMenus1 != null && !sysMenus1.isEmpty()){
|
||||
menuList.addAll(sysMenus1);
|
||||
}
|
||||
}else {
|
||||
// 为非管理员用户查询权限内的菜单
|
||||
menu.getParams().put("userId",userId);
|
||||
menuList = menuMapper.selectMenuListByUserId(menu);
|
||||
}
|
||||
// 去除菜单列表中的重复元素
|
||||
menuList = menuList.stream()
|
||||
.distinct()
|
||||
.toList();
|
||||
return menuList;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据用户ID查询权限
|
||||
*
|
||||
|
|
|
@ -185,6 +185,30 @@
|
|||
<include refid="selectMenuVo"/>
|
||||
where menu_name=#{menuName} and parent_id = #{parentId} limit 1
|
||||
</select>
|
||||
<!-- 查询指定菜单ID列表的系统菜单信息 -->
|
||||
<select id="selectSysMenuList" resultType="com.muyu.system.domain.SysMenu">
|
||||
<include refid="selectMenuVo"></include> <!-- 包含查询菜单信息的基本字段 -->
|
||||
<where>
|
||||
menu_id in (
|
||||
<foreach collection="longList" item="id" separator=",">
|
||||
#{id}
|
||||
</foreach>
|
||||
)
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<!-- 查询指定父级菜单ID列表的子菜单信息 -->
|
||||
<select id="selectSysChildrenList" resultType="com.muyu.system.domain.SysMenu">
|
||||
<include refid="selectMenuVo"></include> <!-- 包含查询菜单信息的基本字段 -->
|
||||
<where>
|
||||
parent_id in (
|
||||
<foreach collection="longList" item="id" separator=",">
|
||||
#{id}
|
||||
</foreach>
|
||||
)
|
||||
</where>
|
||||
</select>
|
||||
|
||||
|
||||
<update id="updateMenu" parameterType="com.muyu.system.domain.SysMenu">
|
||||
update sys_menu
|
||||
|
|
|
@ -152,7 +152,7 @@
|
|||
|
||||
<select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
|
||||
<include refid="selectUserVo"/>
|
||||
where u.user_name = #{userName} and u.del_flag = '0'
|
||||
where u.user_name = #{userName} or u.email = #{userName} and u.del_flag = '0'
|
||||
</select>
|
||||
|
||||
<select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
|
||||
|
|
Loading…
Reference in New Issue