diff --git a/fys-common/src/main/java/com/fuyuanshen/utils/CacheKey.java b/fys-common/src/main/java/com/fuyuanshen/utils/CacheKey.java index e04805a..b640dbc 100644 --- a/fys-common/src/main/java/com/fuyuanshen/utils/CacheKey.java +++ b/fys-common/src/main/java/com/fuyuanshen/utils/CacheKey.java @@ -31,6 +31,8 @@ public interface CacheKey { * 数据 */ String DATA_USER = "data::user:"; + String DATA_APP_USER = "data::appUser:"; + /** * 菜单 diff --git a/fys-common/src/main/java/com/fuyuanshen/utils/SecurityUtils.java b/fys-common/src/main/java/com/fuyuanshen/utils/SecurityUtils.java index 7fa1f1b..1d06236 100644 --- a/fys-common/src/main/java/com/fuyuanshen/utils/SecurityUtils.java +++ b/fys-common/src/main/java/com/fuyuanshen/utils/SecurityUtils.java @@ -21,8 +21,8 @@ import cn.hutool.jwt.JWTUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; -import lombok.extern.slf4j.Slf4j; import com.fuyuanshen.utils.enums.DataScopeEnum; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/security/config/LoginProperties.java b/fys-system/src/main/java/com/fuyuanshen/modules/security/config/LoginProperties.java index c1608f3..3430176 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/security/config/LoginProperties.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/security/config/LoginProperties.java @@ -36,5 +36,6 @@ public class LoginProperties { private boolean singleLogin = false; public static final String cacheKey = "user_login_cache:"; + public static final String cacheKey_app = "app_user_login_cache:"; } diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/security/rest/AuthController.java b/fys-system/src/main/java/com/fuyuanshen/modules/security/rest/AuthController.java index d1f53ec..2ddfd7a 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/security/rest/AuthController.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/security/rest/AuthController.java @@ -37,6 +37,7 @@ import com.fuyuanshen.modules.security.service.dto.JwtUserDto; import com.fuyuanshen.modules.system.domain.app.APPUser; import com.fuyuanshen.modules.system.domain.query.APPUserQuery; import com.fuyuanshen.modules.system.mapper.app.APPUserMapper; +import com.fuyuanshen.modules.system.service.app.APPUserService; import com.fuyuanshen.modules.utils.ResponseVO; import com.fuyuanshen.utils.RedisUtils; import com.fuyuanshen.utils.SecurityUtils; @@ -87,6 +88,7 @@ public class AuthController { private final LoginProperties loginProperties; private final UserDetailsServiceImpl userDetailsService; private final APPUserMapper appUserMapper; + private final APPUserService appUserService; @Log("用户登录") @ApiOperation("登录授权") @@ -172,7 +174,7 @@ public class AuthController { // 4. 加载用户详情 - JwtUserDto jwtUser = userDetailsService.apploadUserByUsername(appUser.getUsername()); + JwtUserDto jwtUser = userDetailsService.loadUserByUsername(appUser.getUsername(),appUser.getUserType()); // 5. 创建认证信息 Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); @@ -182,7 +184,7 @@ public class AuthController { String token = appTokenProvider.createToken(jwtUser); // 7. 获取角色权限 - AppRoleDto appRoleDto = appUserMapper.selectRoleByUserLevel(appUser.getUserLevel()); + //Integer optLevel = appUserService.selectRoleByUserLevel(appUser.getRoles()); // 8. 构建响应数据 Map authInfo = new HashMap<>(2) {{ diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/security/security/app/AppTokenProvider.java b/fys-system/src/main/java/com/fuyuanshen/modules/security/security/app/AppTokenProvider.java index d142637..a0eb675 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/security/security/app/AppTokenProvider.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/security/security/app/AppTokenProvider.java @@ -20,7 +20,6 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import com.fuyuanshen.modules.security.config.SecurityProperties; import com.fuyuanshen.modules.security.service.dto.JwtUserDto; -import com.fuyuanshen.modules.security.service.dto.app.AppJwtUserDto; import com.fuyuanshen.utils.RedisUtils; import io.jsonwebtoken.*; import io.jsonwebtoken.io.Decoders; diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/security/service/OnlineUserService.java b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/OnlineUserService.java index 0354ef7..61beab2 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/security/service/OnlineUserService.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/OnlineUserService.java @@ -15,7 +15,6 @@ */ package com.fuyuanshen.modules.security.service; -import com.fuyuanshen.modules.security.service.dto.app.AppJwtUserDto; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import com.fuyuanshen.modules.security.security.TokenProvider; @@ -45,6 +44,9 @@ public class OnlineUserService { private final TokenProvider tokenProvider; private final RedisUtils redisUtils; + + + /** * 保存在线用户信息 * @param jwtUserDto / @@ -57,10 +59,8 @@ public class OnlineUserService { if (jwtUserDto.getUser() != null) { dept = jwtUserDto.getUser().getDept() == null ? null : jwtUserDto.getUser().getDept().getName(); - }else { - dept=""; - + dept= jwtUserDto.getAppUser().getDept() == null ? null : jwtUserDto.getAppUser().getDept().getName(); } String ip = StringUtils.getIp(request); @@ -69,7 +69,7 @@ public class OnlineUserService { String address = StringUtils.getCityInfo(ip); OnlineUserDto onlineUserDto = null; try { - onlineUserDto = new OnlineUserDto(id, jwtUserDto.getUsername(), jwtUserDto.getUser().getNickName(), dept, browser , ip, address, EncryptUtils.desEncrypt(token), new Date()); + onlineUserDto = new OnlineUserDto(id, jwtUserDto.getUsername(), jwtUserDto.getAppUser().getNickName(), dept, browser , ip, address, EncryptUtils.desEncrypt(token), new Date()); } catch (Exception e) { log.error(e.getMessage(),e); } diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/security/service/UserCacheManager.java b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/UserCacheManager.java index efc915d..c6924c6 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/security/service/UserCacheManager.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/UserCacheManager.java @@ -49,7 +49,6 @@ public class UserCacheManager { if (StringUtils.isNotEmpty(userName)) { // 获取数据 try { - JwtUserDto jwtUserDto = redisUtils.get(LoginProperties.cacheKey + userName, JwtUserDto.class); if (jwtUserDto != null){ jwtUserDto.getUsername(); @@ -94,4 +93,62 @@ public class UserCacheManager { redisUtils.del(LoginProperties.cacheKey + userName); } } + + /** + * 返回用户缓存 + * @param userName 用户名 + * @return JwtUserDto + */ + public JwtUserDto getUserCache(String userName, Integer userType) { + // 转小写 + userName = StringUtils.lowerCase(userName); + if (StringUtils.isNotEmpty(userName)) { + // 获取数据 + try { + JwtUserDto jwtUserDto = redisUtils.get(LoginProperties.cacheKey_app + userName, JwtUserDto.class); + if (jwtUserDto != null){ + jwtUserDto.getUsername(); + } + return jwtUserDto; + } catch (Exception e) { +// redisUtils.del(LoginProperties.cacheKey + userName); + cleanUserCache(userName); + return null; + } + } + + return null; + } + + /** + * 添加缓存到Redis + * @param userName 用户名 + */ + @Async + public void addUserCache(String userName, JwtUserDto user,Integer userType) { + // 转小写 + userName = StringUtils.lowerCase(userName); + if (StringUtils.isNotEmpty(userName)) { + // 添加数据, 避免数据同时过期 + long time = idleTime + RandomUtil.randomInt(900, 1800); + redisUtils.set(LoginProperties.cacheKey_app + userName, user, time); + } + } + + /** + * 清理用户缓存信息 + * 用户信息变更时 + * @param userName 用户名 + */ + @Async + public void cleanUserCache(String userName,Integer userType) { + // 转小写 + userName = StringUtils.lowerCase(userName); + if (StringUtils.isNotEmpty(userName)) { + // 清除数据 + redisUtils.del(LoginProperties.cacheKey_app + userName); + } + } + + } \ No newline at end of file diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/security/service/UserDetailsServiceImpl.java b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/UserDetailsServiceImpl.java index 1e35820..861e5c5 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/security/service/UserDetailsServiceImpl.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/UserDetailsServiceImpl.java @@ -68,9 +68,8 @@ public class UserDetailsServiceImpl implements UserDetailsService { } - - public JwtUserDto apploadUserByUsername(String username) { - JwtUserDto jwtUserDto = userCacheManager.getUserCache(username); + public JwtUserDto loadUserByUsername(String username, Integer userType) { + JwtUserDto jwtUserDto = userCacheManager.getUserCache(username , userType); if (jwtUserDto == null) { APPUser user = userService.appGetLoginData(username); @@ -85,7 +84,7 @@ public class UserDetailsServiceImpl implements UserDetailsService { // 初始化JwtUserDto jwtUserDto = new JwtUserDto(null,user, dataService.getDeptIds(user), authorities); // 添加缓存数据 - userCacheManager.addUserCache(username, jwtUserDto); + userCacheManager.addUserCache(username, jwtUserDto, userType); } } return jwtUserDto; diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/security/service/dto/JwtUserDto.java b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/dto/JwtUserDto.java index c65278f..0e13e96 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/security/service/dto/JwtUserDto.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/dto/JwtUserDto.java @@ -43,7 +43,7 @@ public class JwtUserDto implements UserDetails, java.io.Serializable { @ApiModelProperty(value = "用户") private final User user; - @ApiModelProperty(value = "用户") + @ApiModelProperty(value = "App用户") private final APPUser appUser; @ApiModelProperty(value = "数据权限") diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/security/service/dto/app/AppSecurityQuery.java b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/dto/app/AppSecurityQuery.java new file mode 100644 index 0000000..7ee7db7 --- /dev/null +++ b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/dto/app/AppSecurityQuery.java @@ -0,0 +1,11 @@ +package com.fuyuanshen.modules.security.service.dto.app; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class AppSecurityQuery { + private String username; + private String usertype; +} diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/security/service/dto/app/AppUserCacheManager.java b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/dto/app/AppUserCacheManager.java index 7886e34..6712629 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/security/service/dto/app/AppUserCacheManager.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/security/service/dto/app/AppUserCacheManager.java @@ -44,12 +44,12 @@ public class AppUserCacheManager { * @param userName 用户名 * @return JwtUserDto */ - public AppJwtUserDto getUserCache(String userName) { + public JwtUserDto getUserCache(String userName) { // 转小写 userName = StringUtils.lowerCase(userName); if (StringUtils.isNotEmpty(userName)) { // 获取数据 - return redisUtils.get(LoginProperties.cacheKey + userName, AppJwtUserDto.class); + return redisUtils.get(LoginProperties.cacheKey_app + userName, JwtUserDto.class); } return null; } @@ -59,13 +59,13 @@ public class AppUserCacheManager { * @param userName 用户名 */ @Async - public void addUserCache(String userName, AppJwtUserDto user) { + public void addUserCache(String userName, JwtUserDto user) { // 转小写 userName = StringUtils.lowerCase(userName); if (StringUtils.isNotEmpty(userName)) { // 添加数据, 避免数据同时过期 long time = idleTime + RandomUtil.randomInt(900, 1800); - redisUtils.set(LoginProperties.cacheKey + "a" + userName, user, time); + redisUtils.set(LoginProperties.cacheKey_app + userName, user, time); } } @@ -80,7 +80,7 @@ public class AppUserCacheManager { userName = StringUtils.lowerCase(userName); if (StringUtils.isNotEmpty(userName)) { // 清除数据 - redisUtils.del(LoginProperties.cacheKey + userName); + redisUtils.del(LoginProperties.cacheKey_app + userName); } } } \ No newline at end of file diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/system/rest/app/APPUserController.java b/fys-system/src/main/java/com/fuyuanshen/modules/system/rest/app/APPUserController.java index 1a7a79f..9c0dac3 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/system/rest/app/APPUserController.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/system/rest/app/APPUserController.java @@ -18,6 +18,7 @@ package com.fuyuanshen.modules.system.rest.app; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fuyuanshen.annotation.Log; +import com.fuyuanshen.annotation.rest.AnonymousPostMapping; import com.fuyuanshen.exception.BadRequestException; import com.fuyuanshen.modules.security.service.UserCacheManager; import com.fuyuanshen.modules.security.service.dto.JwtUserDto; @@ -28,6 +29,8 @@ import com.fuyuanshen.modules.system.domain.User; import com.fuyuanshen.modules.system.domain.app.APPUser; import com.fuyuanshen.modules.system.domain.dto.UserPassVo; import com.fuyuanshen.modules.system.domain.dto.UserQueryCriteria; +import com.fuyuanshen.modules.system.domain.dto.app.APPUserDTO; +import com.fuyuanshen.modules.system.domain.query.APPUserQuery; import com.fuyuanshen.modules.system.domain.vo.ConsumerVo; import com.fuyuanshen.modules.system.enums.UserType; import com.fuyuanshen.modules.system.mapper.UserMapper; @@ -38,10 +41,12 @@ import com.fuyuanshen.utils.PageResult; import com.fuyuanshen.utils.SecurityUtils; import com.fuyuanshen.utils.StringUtils; import com.fuyuanshen.utils.enums.CodeEnum; +import io.netty.util.internal.StringUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.formula.functions.T; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.util.CollectionUtils; @@ -50,6 +55,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Collections; @@ -81,6 +87,18 @@ public class APPUserController { return ResponseVO.success(appUserService.queryAPPUser(criteria, page)); } + @Log("app用户注册") + @ApiOperation("app用户注册") + @AnonymousPostMapping(value = "/app/register") + public ResponseVO APPRegister(@Validated @RequestBody APPUserDTO user) throws Exception { + + //暫定0000 + if (user.getVerificationCode() == null || !"0000".equals(user.getVerificationCode())) { + throw new BadRequestException("验证码错误"); + } + appUserService.addUser(user); + return ResponseVO.success("success!!!"); + } @Log("修改APP用户") @ApiOperation("修改APP用户") diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/system/service/app/APPUserService.java b/fys-system/src/main/java/com/fuyuanshen/modules/system/service/app/APPUserService.java index 7bd593d..c8fdacf 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/system/service/app/APPUserService.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/system/service/app/APPUserService.java @@ -17,12 +17,16 @@ package com.fuyuanshen.modules.system.service.app; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.fuyuanshen.modules.security.service.dto.app.AppRoleDto; +import com.fuyuanshen.modules.system.domain.Role; import com.fuyuanshen.modules.system.domain.app.APPUser; import com.fuyuanshen.modules.system.domain.dto.UserQueryCriteria; import com.fuyuanshen.modules.system.domain.dto.app.APPUserDTO; import com.fuyuanshen.modules.utils.ResponseVO; import com.fuyuanshen.utils.PageResult; +import java.util.Set; + /** * @author Zheng Jie * @date 2018-11-23 @@ -48,4 +52,6 @@ public interface APPUserService extends IService { ResponseVO addUser(APPUserDTO user); + + Integer selectRoleByUserLevel(Set roles); } diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/system/service/impl/DataServiceImpl.java b/fys-system/src/main/java/com/fuyuanshen/modules/system/service/impl/DataServiceImpl.java index bd2a71b..c997cfa 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/system/service/impl/DataServiceImpl.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/system/service/impl/DataServiceImpl.java @@ -101,7 +101,7 @@ public class DataServiceImpl implements DataService { */ @Override public List getDeptIds(APPUser user) { - String key = CacheKey.DATA_USER + user.getId(); + String key = CacheKey.DATA_APP_USER + user.getId(); List ids = redisUtils.getList(key, Long.class); if (CollUtil.isEmpty(ids)) { Set deptIds = new HashSet<>(); diff --git a/fys-system/src/main/java/com/fuyuanshen/modules/system/service/impl/app/APPUserServiceImpl.java b/fys-system/src/main/java/com/fuyuanshen/modules/system/service/impl/app/APPUserServiceImpl.java index f793b9b..52be6ea 100644 --- a/fys-system/src/main/java/com/fuyuanshen/modules/system/service/impl/app/APPUserServiceImpl.java +++ b/fys-system/src/main/java/com/fuyuanshen/modules/system/service/impl/app/APPUserServiceImpl.java @@ -18,6 +18,7 @@ package com.fuyuanshen.modules.system.service.impl.app; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fuyuanshen.exception.BadRequestException; +import com.fuyuanshen.modules.system.domain.Role; import com.fuyuanshen.modules.system.domain.app.APPUser; import com.fuyuanshen.modules.system.domain.dto.UserQueryCriteria; import com.fuyuanshen.modules.system.domain.dto.app.APPUserDTO; @@ -28,6 +29,8 @@ import com.fuyuanshen.utils.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.Set; + /** * @author Zheng Jie * @date 2018-11-23 @@ -68,10 +71,10 @@ public class APPUserServiceImpl extends ServiceImpl impl if (appUserMapper.getByUsername(username) != null) { throw new BadRequestException("该手机号已被注册"); } - APPUser appUser = new APPUser(); appUser.setUsername(user.getPhoneNumber().toString()); appUser.setPassword(user.getPassword()); + appUser.setNickName(user.getPhoneNumber()); appUser.setUserLevel((byte) 1); appUser.setPhone(Long.valueOf(user.getPhoneNumber())); appUser.setAdmin((byte) 1); @@ -85,4 +88,9 @@ public class APPUserServiceImpl extends ServiceImpl impl } + @Override + public Integer selectRoleByUserLevel(Set roles) { + return 0; + } + } diff --git a/fys-system/src/main/resources/mapper/system/APPUserMapper.xml b/fys-system/src/main/resources/mapper/system/APPUserMapper.xml index 934d2ec..76176c2 100644 --- a/fys-system/src/main/resources/mapper/system/APPUserMapper.xml +++ b/fys-system/src/main/resources/mapper/system/APPUserMapper.xml @@ -105,6 +105,7 @@ + @@ -131,6 +132,7 @@ u1.is_admin, u1.create_time, u1.update_time, + u1.user_type, r.name AS role_name, r.level AS role_level,