作者 钟来

初始提交

正在显示 36 个修改的文件 包含 1113 行增加190 行删除
... ... @@ -4,7 +4,7 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.zhonglai.luhui.admin.model.LoginUser;
import com.ruoyi.system.login.dto.SysLoginUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType;
... ... @@ -53,7 +53,7 @@ public class SysUserOnlineController extends BaseController
List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
for (String key : keys)
{
LoginUser user = redisCache.getCacheObject(key);
SysLoginUser user = redisCache.getCacheObject(key);
if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
{
if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername()))
... ...
... ... @@ -5,6 +5,7 @@ import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.entity.SysMenu;
import com.ruoyi.system.domain.entity.SysUser;
import com.ruoyi.system.login.service.LoginService;
import com.zhonglai.luhui.admin.model.LoginBody;
import com.ruoyi.common.utils.SecurityUtils;
import com.zhonglai.luhui.admin.service.SysLoginService;
... ... @@ -31,7 +32,7 @@ import java.util.Set;
public class SysLoginController extends BaseController
{
@Autowired
private SysLoginService loginService;
private LoginService loginService;
@Autowired
private ISysMenuService menuService;
... ... @@ -45,7 +46,7 @@ public class SysLoginController extends BaseController
{
AjaxResult ajax = AjaxResult.success();
// 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
String token = loginService.sysUserLogin(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid());
ajax.put(Constants.TOKEN, token);
return ajax;
... ... @@ -60,7 +61,7 @@ public class SysLoginController extends BaseController
@GetMapping("getInfo")
public AjaxResult getInfo()
{
SysUser user = SecurityUtils.getLoginUser().getUser();
SysUser user = (SysUser) SecurityUtils.getLoginUser().getUser();
// 角色集合
Set<String> roles = permissionService.getRolePermission(user);
// 权限集合
... ...
... ... @@ -6,12 +6,12 @@ import com.ruoyi.system.domain.entity.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.entity.SysUser;
import com.zhonglai.luhui.admin.model.LoginUser;
import com.ruoyi.system.login.dto.SysLoginUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.login.service.TokenService;
import com.ruoyi.system.service.ISysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
... ... @@ -44,7 +44,7 @@ public class SysProfileController extends BaseController
@GetMapping
public AjaxResult profile()
{
LoginUser loginUser = getLoginUser();
SysLoginUser loginUser = getLoginUser();
SysUser user = loginUser.getUser();
AjaxResult ajax = AjaxResult.success(user);
ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
... ... @@ -60,7 +60,7 @@ public class SysProfileController extends BaseController
@PutMapping
public AjaxResult updateProfile(@RequestBody SysUser user)
{
LoginUser loginUser = getLoginUser();
SysLoginUser loginUser = getLoginUser();
SysUser sysUser = loginUser.getUser();
user.setUserName(sysUser.getUserName());
if (StringUtils.isNotEmpty(user.getPhonenumber())
... ... @@ -96,7 +96,7 @@ public class SysProfileController extends BaseController
@PutMapping("/updatePwd")
public AjaxResult updatePwd(String oldPassword, String newPassword)
{
LoginUser loginUser = getLoginUser();
SysLoginUser loginUser = getLoginUser();
String userName = loginUser.getUsername();
String password = loginUser.getPassword();
if (!SecurityUtils.matchesPassword(oldPassword, password))
... ... @@ -127,7 +127,7 @@ public class SysProfileController extends BaseController
{
if (!file.isEmpty())
{
LoginUser loginUser = getLoginUser();
SysLoginUser loginUser = getLoginUser();
String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file);
if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
{
... ...
... ... @@ -6,13 +6,13 @@ import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.system.domain.entity.SysRole;
import com.ruoyi.system.domain.entity.SysUser;
import com.zhonglai.luhui.admin.model.LoginUser;
import com.ruoyi.system.login.dto.SysLoginUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.zhonglai.luhui.admin.service.SysPermissionService;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.login.service.TokenService;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
... ... @@ -127,7 +127,7 @@ public class SysRoleController extends BaseController
if (roleService.updateRole(role) > 0)
{
// 更新缓存用户权限
LoginUser loginUser = getLoginUser();
SysLoginUser loginUser = getLoginUser();
if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
{
loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
... ...
package com.zhonglai.luhui.admin.service;
import com.ruoyi.common.core.domain.BaseLoginUser;
import com.ruoyi.system.domain.entity.SysRole;
import com.zhonglai.luhui.admin.model.LoginUser;
import com.ruoyi.system.login.dto.SysLoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.stereotype.Service;
... ... @@ -40,7 +39,7 @@ public class PermissionService
{
return false;
}
LoginUser loginUser = (LoginUser) SecurityUtils.getLoginUser();
SysLoginUser loginUser = (SysLoginUser) SecurityUtils.getLoginUser();
if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions()))
{
return false;
... ... @@ -71,7 +70,7 @@ public class PermissionService
{
return false;
}
LoginUser loginUser = (LoginUser) SecurityUtils.getLoginUser();
SysLoginUser loginUser = (SysLoginUser) SecurityUtils.getLoginUser();
if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions()))
{
return false;
... ... @@ -99,7 +98,7 @@ public class PermissionService
{
return false;
}
LoginUser loginUser = (LoginUser) SecurityUtils.getLoginUser();
SysLoginUser loginUser = (SysLoginUser) SecurityUtils.getLoginUser();
if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles()))
{
return false;
... ... @@ -138,7 +137,7 @@ public class PermissionService
{
return false;
}
LoginUser loginUser = (LoginUser) SecurityUtils.getLoginUser();
SysLoginUser loginUser = (SysLoginUser) SecurityUtils.getLoginUser();
if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles()))
{
return false;
... ...
package com.zhonglai.luhui.admin.service;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.system.domain.entity.SysUser;
import com.zhonglai.luhui.admin.model.LoginUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.login.service.TokenService;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
... ... @@ -41,96 +22,9 @@ public class SysLoginService
@Resource
private AuthenticationManager authenticationManager;
@Autowired
private RedisCache redisCache;
@Autowired
private ISysUserService userService;
@Autowired
private ISysConfigService configService;
/**
* 登录验证
*
* @param username 用户名
* @param password 密码
* @param code 验证码
* @param uuid 唯一标识
* @return 结果
*/
public String login(String username, String password, String code, String uuid)
{
// boolean captchaOnOff = configService.selectCaptchaOnOff();
// // 验证码开关
// if (captchaOnOff)
// {
// validateCaptcha(username, code, uuid);
// }
// 用户验证
Authentication authentication = null;
try
{
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
authentication = authenticationManager
.authenticate(new UsernamePasswordAuthenticationToken(username, password));
}
catch (Exception e)
{
if (e instanceof BadCredentialsException)
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
throw new UserPasswordNotMatchException();
}
else
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
throw new ServiceException(e.getMessage());
}
}
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
recordLoginInfo(loginUser.getUserId());
// 生成token
return tokenService.createToken(loginUser);
}
/**
* 校验验证码
*
* @param username 用户名
* @param code 验证码
* @param uuid 唯一标识
* @return 结果
*/
public void validateCaptcha(String username, String code, String uuid)
{
String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
String captcha = redisCache.getCacheObject(verifyKey);
redisCache.deleteObject(verifyKey);
if (captcha == null)
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
throw new CaptchaExpireException();
}
if (!code.equalsIgnoreCase(captcha))
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
throw new CaptchaException();
}
}
/**
* 记录登录信息
*
* @param userId 用户ID
*/
public void recordLoginInfo(Long userId)
{
SysUser sysUser = new SysUser();
sysUser.setUserId(userId);
sysUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
sysUser.setLoginDate(DateUtils.getNowDate());
userService.updateUserProfile(sysUser);
}
}
... ...
... ... @@ -10,8 +10,8 @@ import com.ruoyi.common.exception.user.CaptchaExpireException;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.system.login.manager.AsyncManager;
import com.ruoyi.system.login.manager.factory.AsyncFactory;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
... ...
package com.zhonglai.luhui.admin.service;
import com.ruoyi.system.domain.entity.SysUser;
import com.zhonglai.luhui.admin.model.LoginUser;
import com.ruoyi.system.login.dto.SysLoginUser;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
... ... @@ -20,9 +20,9 @@ import org.springframework.stereotype.Service;
* @author ruoyi
*/
@Service
public class UserDetailsServiceImpl implements UserDetailsService
public class SysUserDetailsServiceImpl implements UserDetailsService
{
private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
private static final Logger log = LoggerFactory.getLogger(SysUserDetailsServiceImpl.class);
@Autowired
private ISysUserService userService;
... ... @@ -55,6 +55,6 @@ public class UserDetailsServiceImpl implements UserDetailsService
public UserDetails createLoginUser(SysUser user)
{
return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
return new SysLoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
}
}
... ...
... ... @@ -2,7 +2,7 @@ package com.zhonglai.luhui.admin.service;
import com.ruoyi.common.core.domain.BaseLoginUser;
import com.ruoyi.framework.web.service.ISysUserOnlineService;
import com.zhonglai.luhui.admin.model.LoginUser;
import com.ruoyi.system.login.dto.SysLoginUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserOnline;
import org.springframework.stereotype.Service;
... ... @@ -73,7 +73,7 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
{
return null;
}
LoginUser user = (LoginUser) baseLoginUser;
SysLoginUser user = (SysLoginUser) baseLoginUser;
SysUserOnline sysUserOnline = new SysUserOnline();
sysUserOnline.setTokenId(user.getToken());
sysUserOnline.setUserName(user.getUsername());
... ...
... ... @@ -10,6 +10,7 @@ import org.springframework.context.annotation.ComponentScan;
"com.ruoyi.system",
"com.ruoyi.framework",
"com.zhonglai.luhui.api.config",
"com.zhonglai.luhui.api.service",
"com.zhonglai.luhui.api.controller",
})
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
... ...
package com.zhonglai.luhui.api.config;
import com.zhonglai.luhui.api.dto.ApiLoginUser;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class ApiUserDetailsServiceImpl implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return new ApiLoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
}
}
package com.zhonglai.luhui.api.controller.login;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.login.service.LoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@Api(tags = "登陆")
@RestController
@RequestMapping("/login/ApiLogin")
public class ApiLoginController extends BaseController {
public static String YU2LE_LOGIN_TOKEN_KEY = "loginToken"; //登录令牌键值
@Autowired
private LoginService loginService;
@ApiOperation("账号密码登陆")
@PostMapping("/userpassLogin")
public AjaxResult userpassLogin(String user,String pass)
{
AjaxResult ajax = AjaxResult.success();
//生成令牌
String token = loginService.apiLoginByPass(user,pass);
ajax.put(Constants.TOKEN, token);
return ajax;
}
@ApiOperation("鱼儿乐token登陆")
@PostMapping("/yu2leTokenLogin")
public AjaxResult yu2leTokenLogin(HttpServletRequest request)
{
String loginToken = request.getHeader(YU2LE_LOGIN_TOKEN_KEY);
if(StringUtils.isEmpty(loginToken))
{
return AjaxResult.error("请输入鱼儿乐令牌");
}
AjaxResult ajax = AjaxResult.success();
//生成令牌
String token = loginService.yu2leTokenLogin(loginToken);
ajax.put(Constants.TOKEN, token);
return ajax;
}
}
... ...
package com.zhonglai.luhui.api.controller;
package com.zhonglai.luhui.api.controller.user;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
... ...
package com.zhonglai.luhui.api.controller;
package com.zhonglai.luhui.api.controller.user;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
... ...
... ... @@ -2,17 +2,24 @@ package com.zhonglai.luhui.api.dto;
import com.alibaba.fastjson.annotation.JSONField;
import com.ruoyi.common.core.domain.BaseLoginUser;
import com.ruoyi.system.login.dto.Yu2leUserInfo;
import com.ruoyi.system.login.dto.Yu2leUserLogin;
import org.springframework.security.core.GrantedAuthority;
import java.util.Collection;
public class ApiLoginUser extends BaseLoginUser {
private UserInfo userInfo;
private Yu2leUserInfo userInfo;
private UserLogin userLogin;
private Yu2leUserLogin userLogin;
public ApiLoginUser(Yu2leUserInfo userInfo, Yu2leUserLogin userLogin) {
this.userInfo = userInfo;
this.userLogin = userLogin;
}
@Override
public UserInfo getUser() {
public Yu2leUserInfo getUser() {
return userInfo;
}
... ... @@ -73,15 +80,15 @@ public class ApiLoginUser extends BaseLoginUser {
return false;
}
public void setUserInfo(UserInfo userInfo) {
public void setUserInfo(Yu2leUserInfo userInfo) {
this.userInfo = userInfo;
}
public UserLogin getUserLogin() {
public Yu2leUserLogin getUserLogin() {
return userLogin;
}
public void setUserLogin(UserLogin userLogin) {
public void setUserLogin(Yu2leUserLogin userLogin) {
this.userLogin = userLogin;
}
}
... ...
package com.zhonglai.luhui.api.service;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.login.dto.Yu2leUserInfo;
import com.ruoyi.system.login.dto.Yu2leUserLogin;
import com.ruoyi.system.service.PublicService;
import com.zhonglai.luhui.api.dto.ApiLoginUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class ApiUserDetailsServiceImpl implements UserDetailsService {
private static final Logger log = LoggerFactory.getLogger(ApiUserDetailsServiceImpl.class);
@Autowired
private PublicService publicService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Yu2leUserLogin yu2leUserLogin = publicService.getObjectForTableName(Yu2leUserLogin.class,"loginName",username,"`liu_yu_le`.`user_login`");
Yu2leUserInfo yu2leUserInfo = null;
if (StringUtils.isNull(yu2leUserLogin) || StringUtils.isNull(yu2leUserInfo))
{
log.info("登录用户:{} 不存在.", username);
throw new ServiceException("登录用户:" + username + " 不存在");
}
else if (1==yu2leUserInfo.getIsInvalid())
{
log.info("登录用户:{} 已被停用.", username);
throw new ServiceException("对不起,您的账号:" + username + " 已停用");
}
return new ApiLoginUser(yu2leUserInfo, yu2leUserLogin);
}
}
... ...
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-api # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/tool/gen/generatorCodeFromDb
\ No newline at end of file
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-api # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login/ApiLogin/*
\ No newline at end of file
... ...
package com.ruoyi.common.utils;
import org.apache.commons.lang3.StringUtils;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.SecureRandom;
import java.util.Random;
/**
* 采用MD5加密解密
* @author tfq
* @datetime 2011-10-13
*/
public class DESUtil {
private static final String KEY = "kimwaynet";// 密钥
private final static String DES = "DES";// DES算法名称
//加密
private static byte[] encrypt(byte[] src, byte[] key) throws Exception {
SecureRandom sr = new SecureRandom();
DESKeySpec dks = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(DES);
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
return cipher.doFinal(src);
}
//解密
private static byte[] decrypt(byte[] src, byte[] key) throws Exception {
SecureRandom sr = new SecureRandom();
DESKeySpec dks = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(DES);
cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
return cipher.doFinal(src);
}
private static String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}
return hs.toUpperCase();
}
private static byte[] hex2byte(byte[] b) {
if ((b.length % 2) != 0)
throw new IllegalArgumentException("length not even");
byte[] b2 = new byte[b.length / 2];
for (int n = 0; n < b.length; n += 2) {
String item = new String(b, n, 2);
b2[n / 2] = (byte) Integer.parseInt(item, 16);
}
return b2;
}
//解密
public static String decode(String src,String key) {
if(StringUtils.isEmpty(key))
{
key = KEY;
}
String decryptStr = "";
try {
decryptStr = new String(decrypt(hex2byte(src.getBytes()),key.getBytes()));
} catch (Exception ex) {
ex.printStackTrace();
}
return decryptStr;
}
//加密
public static String encode(String src,String key){
if(StringUtils.isEmpty(key))
{
key = KEY;
}
byte[] bytes = null;
String encryptStr = "";
try {
bytes = encrypt(src.getBytes(), key.getBytes());
} catch (Exception ex) {
ex.printStackTrace();
}
if (bytes != null)
encryptStr = byte2hex(bytes);
return encryptStr;
}
public static String getDecodeMAC(String decryptStr){
String mac = "";
String[] strs = decryptStr.split(":");
if (strs.length == 5) {
mac = strs[0];
}
return mac;
}
/**
* 生成指定长度的随机字符串
* @param args
*/
/**
* 产生随机字符串
* */
private static Random randGen = null;
private static char[] numbersAndLetters = null;
public static final String randomString(int length) {
if (length < 1) {
return null;
}
if (randGen == null) {
randGen = new Random();
numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyz" +
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
//numbersAndLetters = ("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
}
char [] randBuffer = new char[length];
for (int i=0; i<randBuffer.length; i++) {
randBuffer[i] = numbersAndLetters[randGen.nextInt(71)];
//randBuffer[i] = numbersAndLetters[randGen.nextInt(35)];
}
return new String(randBuffer);
}
// 测试主函数
public static void main(String args[]) {
// String s = new String("F:/yu2le-service-log");
// System.out.println("原始:" + s);
// s = encode(s,"LINUXYU2LE");
// System.out.println("加密的:" + s);
System.out.println("解密的:" + decode("498CFDA0AA8A2E9A","kimwaynet"));
// System.out.println(encode("13912927204","LS6GzB"));
}
}
\ No newline at end of file
... ...
... ... @@ -9,8 +9,8 @@ import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.system.login.manager.AsyncManager;
import com.ruoyi.system.login.manager.factory.AsyncFactory;
import com.ruoyi.system.domain.SysOperLog;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
... ...
... ... @@ -3,7 +3,7 @@ package com.ruoyi.framework.security.filter;
import com.ruoyi.common.core.domain.BaseLoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.login.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
... ...
... ... @@ -7,9 +7,9 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.BaseLoginUser;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.login.manager.AsyncManager;
import com.ruoyi.system.login.manager.factory.AsyncFactory;
import com.ruoyi.system.login.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.Authentication;
... ...
... ... @@ -281,10 +281,12 @@ public class PublicSQL {
tableName = (String) para.get("tableName");
}
String select = "*";
String select = "";
if(para.containsKey("select") && null != para.get("select"))
{
select = (String) para.get("select");
}else{
select = getSelect(clas);
}
if(StringUtils.isBlank(tableName))
... ... @@ -469,6 +471,8 @@ public class PublicSQL {
if(para.containsKey("selectStr") && null != para.get("selectStr"))
{
selectStr = para.get("selectStr")+"";
}else{
selectStr = getSelect(object.getClass());
}
String tableName = changTableNameFromObject(object);
... ... @@ -702,4 +706,29 @@ public class PublicSQL {
public static String escapeSql(String str) {
return str == null ? null : StringUtils.replace(str, "'", "''");
}
private String getSelect(Class<?> clas)
{
String select = "";
Field[] fields = clas.getDeclaredFields();
for(Field field:fields)
{
PublicSQLConfig publicSQLConfig = field.getAnnotation(PublicSQLConfig.class);
if(null != publicSQLConfig && !publicSQLConfig.isSelect())
{
continue;
}
if(!"".equals(select))
{
select += ",";
}
String fieldName = field.getName();
select +="`"+ com.ruoyi.common.utils.StringUtils.toUnderScoreCase(fieldName) +"` "+fieldName;
}
if("".equals(select))
{
select = "*";
}
return select;
}
}
... ...
package com.ruoyi.system.dto;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PublicSQLConfig {
boolean isSelect() default true;
}
... ...
package com.ruoyi.system.login.dto;
import com.ruoyi.common.core.domain.BaseLoginUser;
import org.springframework.security.core.GrantedAuthority;
import java.util.Collection;
public class ApiLoginUser extends BaseLoginUser {
private static final long serialVersionUID = -2519976444812946707L;
private Yu2leUserLogin yu2leUserLogin;
public ApiLoginUser(Yu2leUserLogin yu2leUserLogin) {
this.yu2leUserLogin = yu2leUserLogin;
}
@Override
public Object getUser() {
return yu2leUserLogin;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return yu2leUserLogin.getLoginPass();
}
@Override
public String getUsername() {
return yu2leUserLogin.getLoginName();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
public Yu2leUserLogin getYu2leUserLogin() {
return yu2leUserLogin;
}
public void setYu2leUserLogin(Yu2leUserLogin yu2leUserLogin) {
this.yu2leUserLogin = yu2leUserLogin;
}
}
... ...
package com.zhonglai.luhui.admin.model;
package com.ruoyi.system.login.dto;
import com.alibaba.fastjson.annotation.JSONField;
import com.ruoyi.common.core.domain.BaseLoginUser;
... ... @@ -13,7 +13,7 @@ import java.util.Set;
*
* @author ruoyi
*/
public class LoginUser extends BaseLoginUser
public class SysLoginUser extends BaseLoginUser
{
private static final long serialVersionUID = 1L;
... ... @@ -44,17 +44,17 @@ public class LoginUser extends BaseLoginUser
}
public LoginUser()
public SysLoginUser()
{
}
public LoginUser(SysUser user, Set<String> permissions)
public SysLoginUser(SysUser user, Set<String> permissions)
{
this.user = user;
this.permissions = permissions;
}
public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions)
public SysLoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions)
{
setUserId(userId);
this.deptId = deptId;
... ...
package com.ruoyi.system.login.dto;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.DESUtil;
import com.ruoyi.common.utils.DateUtils;
import java.io.Serializable;
/**
* 登录令牌
*/
public class Yu2leLoginToken implements Serializable {
private static final long serialVersionUID = -8696564127500370479L;
private Integer userId; //当前用户id
private String userLoginName; //当前用户登录名
private String userNickName; //当前用户昵称
private Integer parentUserId; //上级用户id,没有就是顶级
private String parentUserLoginName; //上级用户登录名
private String parentUserNickName; //上级用户昵称
private JSONObject date; //数据
private Integer createTime; //生成时间
private String key = "LiuYuLeXX"; //密钥
private Integer userType; //用户类型(0普通用户,1管理员)
private Integer isOperation = 1; //有无操作权限 (0无,1有)
public Integer getIsOperation() {
return isOperation;
}
public void setIsOperation(Integer isOperation) {
this.isOperation = isOperation;
}
public Yu2leLoginToken()
{
}
public Yu2leLoginToken(Integer userId, String userLoginName, String userNickName, Integer userType)
{
this.userId = userId;
this.userLoginName = userLoginName;
this.userNickName = userNickName;
this.createTime = DateUtils.getNowTimeMilly();
this.userType = userType;
}
public Yu2leLoginToken(Integer userId, String userLoginName, String userNickName, Integer userType, Integer parentUserId)
{
this.userId = userId;
this.userLoginName = userLoginName;
this.userNickName = userNickName;
this.parentUserId = parentUserId;
this.userType = userType;
this.createTime = DateUtils.getNowTimeMilly();
}
public Yu2leLoginToken(Integer userId, String userLoginName, String userNickName, Integer userType, Integer parentUserId, JSONObject date)
{
this.userId = userId;
this.userLoginName = userLoginName;
this.userNickName = userNickName;
this.parentUserId = parentUserId;
this.userType = userType;
this.date = date;
this.createTime = DateUtils.getNowTimeMilly();
}
/**
* 解密token
* @param deLoginToken
*/
public Yu2leLoginToken(String deLoginToken)
{
String loginTokenString = DESUtil.decode(deLoginToken,key);
JSONObject jsonObject = JSONObject.parseObject(loginTokenString, JSONObject.class);
if(jsonObject.containsKey("userId"))
{
userId = jsonObject.getInteger("userId");
}
if(jsonObject.containsKey("userLoginName"))
{
userLoginName = jsonObject.getString("userLoginName");
}
if(jsonObject.containsKey("userNickName"))
{
userNickName = jsonObject.getString("userNickName");
}
if(jsonObject.containsKey("parentUserId"))
{
parentUserId = jsonObject.getInteger("parentUserId");
}
if(jsonObject.containsKey("date"))
{
date = jsonObject.getJSONObject("date");
}
if(jsonObject.containsKey("createTime"))
{
createTime = jsonObject.getInteger("createTime");
}
if(jsonObject.containsKey("userType"))
{
userType = jsonObject.getInteger("userType");
}
}
/**
* 生成加密loginToken
* @return
*/
public String get()
{
return DESUtil.encode(JSONObject.toJSONString(this),key);
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserLoginName() {
return userLoginName;
}
public void setUserLoginName(String userLoginName) {
this.userLoginName = userLoginName;
}
public String getUserNickName() {
return userNickName;
}
public void setUserNickName(String userNickName) {
this.userNickName = userNickName;
}
public Integer getParentUserId() {
return parentUserId;
}
public void setParentUserId(Integer parentUserId) {
this.parentUserId = parentUserId;
}
public JSONObject getDate() {
return date;
}
public void setDate(JSONObject date) {
this.date = date;
}
public Integer getCreateTime() {
return createTime;
}
public void setCreateTime(Integer createTime) {
this.createTime = createTime;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Integer getUserType() {
return userType;
}
public void setUserType(Integer userType) {
this.userType = userType;
}
public String getParentUserLoginName() {
return parentUserLoginName;
}
public void setParentUserLoginName(String parentUserLoginName) {
this.parentUserLoginName = parentUserLoginName;
}
public String getParentUserNickName() {
return parentUserNickName;
}
public void setParentUserNickName(String parentUserNickName) {
this.parentUserNickName = parentUserNickName;
}
}
... ...
package com.zhonglai.luhui.api.dto;
package com.ruoyi.system.login.dto;
import com.ruoyi.system.dto.PublicSQLConfig;
import java.io.Serializable;
/**
* 用户信息
*/
public class UserInfo implements Serializable {
public class Yu2leUserInfo implements Serializable {
@PublicSQLConfig(isSelect = false)
private static final long serialVersionUID = 2442852637823064570L;
private Integer id; // int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
private String loginName; // varchar(50) NOT NULL COMMENT '登录名',
private String name; // varchar(50) DEFAULT NULL COMMENT '真实姓名',
... ...
package com.zhonglai.luhui.api.dto;
package com.ruoyi.system.login.dto;
import com.ruoyi.system.dto.PublicSQLConfig;
import java.io.Serializable;
/**
* 用户登录
*/
public class UserLogin {
public class Yu2leUserLogin implements Serializable {
@PublicSQLConfig(isSelect = false)
private static final long serialVersionUID = -3205855629462027722L;
private Integer id; // int(11) NOT NULL AUTO_INCREMENT COMMENT '用户登录主键主键',
private Integer userId; // int(11) NOT NULL COMMENT '用户主键id',
private String loginName; // varchar(50) NOT NULL COMMENT '用户登录名',
... ...
package com.ruoyi.framework.manager;
package com.ruoyi.system.login.manager;
import com.ruoyi.common.utils.Threads;
import com.ruoyi.common.utils.spring.SpringUtils;
... ...
package com.ruoyi.framework.manager;
package com.ruoyi.system.login.manager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ... @@ -14,7 +14,7 @@ import javax.annotation.PreDestroy;
@Component
public class ShutdownManager
{
private static final Logger logger = LoggerFactory.getLogger("sys-user");
private static final Logger logger = LoggerFactory.getLogger(ShutdownManager.class);
@PreDestroy
public void destroy()
... ...
package com.ruoyi.framework.manager.factory;
package com.ruoyi.system.login.manager.factory;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.LogUtils;
... ...
package com.ruoyi.system.login.service;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.ip.IpUtils;
import com.ruoyi.system.domain.entity.SysUser;
import com.ruoyi.system.login.dto.ApiLoginUser;
import com.ruoyi.system.login.dto.SysLoginUser;
import com.ruoyi.system.login.dto.Yu2leUserLogin;
import com.ruoyi.system.login.dto.Yu2leLoginToken;
import com.ruoyi.system.login.manager.AsyncManager;
import com.ruoyi.system.login.manager.factory.AsyncFactory;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.PublicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* 登陆业务
*/
@Service
public class LoginService {
@Autowired
private PublicService publicService;
@Autowired
private RedisCache redisCache;
@Resource
private AuthenticationManager authenticationManager;
@Autowired
private ISysUserService userService;
@Autowired
private TokenService tokenService;
/**
* 管理员用户名密码登录验证
*
* @param username 用户名
* @param password 密码
* @param code 验证码
* @param uuid 唯一标识
* @return 结果
*/
public String sysUserLogin(String username, String password, String code, String uuid)
{
// boolean captchaOnOff = configService.selectCaptchaOnOff();
// // 验证码开关
// if (captchaOnOff)
// {
// validateCaptcha(username, code, uuid);
// }
// 用户验证
Authentication authentication = userPasswordVerification(username,password);
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("sysuser.login.success")));
SysLoginUser loginUser = (SysLoginUser) authentication.getPrincipal();
recordLoginInfo(loginUser.getUserId());
// 生成token
return tokenService.createToken(loginUser);
}
/**
* api用户名密码登陆验证
* @param user
* @param pass
* @return
*/
public String apiLoginByPass(String user,String pass) {
// 用户验证
Authentication authentication = userPasswordVerification(user,pass);
AsyncManager.me().execute(AsyncFactory.recordLogininfor(user, Constants.LOGIN_SUCCESS, MessageUtils.message("apiuser.login.success")));
ApiLoginUser loginUser = (ApiLoginUser) authentication.getPrincipal();
recordLoginInfo(loginUser.getUserId());
return tokenService.createToken(loginUser);
}
/**
* 刷新api端token
* @param token
* @return
*/
public String refreshApiToken(String token) {
return null;
}
/**
* 鱼儿乐token登陆
* @param token
* @return
*/
public String yu2leTokenLogin(String token) {
Yu2leLoginToken loginToken = new Yu2leLoginToken(token);
Yu2leUserLogin userInfo = publicService.getObjectForTableName(Yu2leUserLogin.class,"id",loginToken.getUserId()+"","`liu_yu_le`.`user_login`");
return apiLoginByPass(userInfo.getLoginName(),userInfo.getLoginPass());
}
/**
* 记录登录信息
*
* @param userId 用户ID
*/
private void recordLoginInfo(Long userId)
{
SysUser sysUser = new SysUser();
sysUser.setUserId(userId);
sysUser.setLoginIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
sysUser.setLoginDate(DateUtils.getNowDate());
userService.updateUserProfile(sysUser);
}
/**
* 校验验证码
*
* @param username 用户名
* @param code 验证码
* @param uuid 唯一标识
* @return 结果
*/
private void validateCaptcha(String username, String code, String uuid)
{
String verifyKey = Constants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");
String captcha = redisCache.getCacheObject(verifyKey);
redisCache.deleteObject(verifyKey);
if (captcha == null)
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
throw new CaptchaExpireException();
}
if (!code.equalsIgnoreCase(captcha))
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
throw new CaptchaException();
}
}
private Authentication userPasswordVerification(String username,String password)
{
Authentication authentication = null;
try
{
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
authentication = authenticationManager
.authenticate(new UsernamePasswordAuthenticationToken(username, password));
}
catch (Exception e)
{
if (e instanceof BadCredentialsException)
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
throw new UserPasswordNotMatchException();
}
else
{
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
throw new ServiceException(e.getMessage());
}
}
return authentication;
}
}
... ...
package com.ruoyi.framework.web.service;
package com.ruoyi.system.login.service;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.BaseLoginUser;
... ...
... ... @@ -2,6 +2,7 @@ package com.ruoyi.system.mapper;
import com.ruoyi.system.dto.PublicSQL;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
... ... @@ -9,6 +10,7 @@ import java.util.Map;
/**
* 公用mapper
*/
@Component
public interface PublicMapper {
/**
* 添加对象
... ... @@ -40,14 +42,14 @@ public interface PublicMapper {
* @param whereFieldNames
*/
@UpdateProvider(type = PublicSQL.class, method = "updateObject")
void updateObject(@Param("object") Object object, @Param("whereFieldNames") String whereFieldNames);
int updateObject(@Param("object") Object object, @Param("whereFieldNames") String whereFieldNames);
/**
* 自定义sql更新
* @param sql
*/
@UpdateProvider(type = PublicSQL.class, method = "updateBySql")
void updateBySql(String sql);
int updateBySql(String sql);
/**
* 查询 通过条件查询
... ... @@ -67,7 +69,7 @@ public interface PublicMapper {
* @return
*/
@SelectProvider(type = PublicSQL.class, method = "getObject")
Map<String,Object> getObjectForTableName(@Param("class") Class<?> clas, @Param("idName") String idName, @Param("values") String values, @Param("tableName") String tableName);
<T> T getObjectForTableName(@Param("class") Class<T> clas, @Param("idName") String idName, @Param("values") String values, @Param("tableName") String tableName);
/**
* 查询 通过条件查询单个指定项目
... ... @@ -107,7 +109,7 @@ public interface PublicMapper {
* @param map
*/
@UpdateProvider(type = PublicSQL.class, method = "deleteObjectByContent")
void deleteObjectByContent(@Param("objectCalss") Class<?> oClass, @Param("map") Map<String, String> map);
int deleteObjectByContent(@Param("objectCalss") Class<?> oClass, @Param("map") Map<String, String> map);
/**
* 自定义sql语句查询list
... ... @@ -123,7 +125,7 @@ public interface PublicMapper {
* @return
*/
@UpdateProvider(type = PublicSQL.class, method = "saveOrUpdateObjectList")
void saveOrUpdateObjectList(List<Object> objectlist);
int saveOrUpdateObjectList(List<Object> objectlist);
/**
* 添加或更新对象
... ... @@ -132,16 +134,16 @@ public interface PublicMapper {
* @return
*/
@UpdateProvider(type = PublicSQL.class, method = "saveOrUpdateObject")
void saveOrUpdateObject(Object object);
int saveOrUpdateObject(Object object);
/**
* 通过id删除数据
* @return
*/
@UpdateProvider(type = PublicSQL.class, method = "deleteObjectById")
void deleteObjectById(@Param("objectCalss") Class<?> oClass, @Param("id") String id);
int deleteObjectById(@Param("objectCalss") Class<?> oClass, @Param("id") String id);
@Options(useGeneratedKeys = false)
@InsertProvider(type = PublicSQL.class, method = "updateBySql")
void insertIntoBySql(@Param("sql") String sql);
int insertIntoBySql(@Param("sql") String sql);
}
... ...
package com.ruoyi.system.service;
import java.util.List;
import java.util.Map;
/**
* 公用mapper
*/
public interface PublicService {
/**
* 添加对象
*/
int insert(Object object);
/**
* 指定表名添加
*/
int insertToTable(Object object, String tableName);
/**
* 添加对象集合
*/
int insertAll(List<?> list);
/**
* 指定表名添加对象集合
*/
int insertAllToTable(List<?> list, String tableName);
/**
* 更新对象不为空的属性
* @param object
* @param whereFieldNames
*/
int updateObject( Object object, String whereFieldNames);
/**
* 自定义sql更新
* @param sql
*/
int updateBySql(String sql);
/**
* 查询 通过条件查询
* @param clas
* @param idName
* @param values
* @return
*/
<T> T getObject( Class<?> clas, String idName, String values);
/**
* 查询 通过条件查询
* @param clas
* @param idName
* @param values
* @return
*/
<T> T getObjectForTableName(Class<T> clas, String idName, String values, String tableName);
/**
* 查询 通过条件查询单个指定项目
* @param clas 類型
* @param select 查詢結果
* @param idName 主鍵名稱
* @param values 主鍵值
* @return
*/
Map<String,Object> getObjectSelectTableName(Class<?> clas, String select, String idName, String values, String tableName);
/**
* 查询list
* @param object
* @param whereMap 如果是时间,whereMap里面对应的字段比较符为time,同时添加一个end_字段名的值 表示是结束时间
* @param order
* @param pagetSize
* @param pageNo
* @return
*/
List<Map<String,Object>> getObjectList(Object object,String selectStr,Map<String, String> whereMap, String order, Integer pagetSize,Integer pageNo);
/**
* 查詢totle
* @param object
* @param whereMap 如果是时间,whereMap里面对应的字段比较符为time,同时添加一个end_字段名的值 表示是结束时间
* @return
*/
Long getObjectListTotle(Object object, Map<String, String> whereMap);
/**
* 通过条件删除对象
* @param oClass
* @param map
*/
int deleteObjectByContent(Class<?> oClass, Map<String, String> map);
/**
* 自定义sql语句查询list
* @param sql
* @return
*/
List<Map<String,Object>> getObjectListBySQL(String sql);
/**
* 添加或更新对象列表
* INSERT INTO `test` (`in1`,`str1`)VALUES ('1','2'),('2','2') ON DUPLICATE KEY UPDATE `in1`=VALUES(`in1`),`str1`=VALUES(`str1`);
* @param objectlist 对象列表
* @return
*/
int saveOrUpdateObjectList(List<Object> objectlist);
/**
* 添加或更新对象
* INSERT INTO test(`in1`,`str1`) VALUES ('1','1');
* @param object 对象
* @return
*/
int saveOrUpdateObject(Object object);
/**
* 通过id删除数据
* @return
*/
int deleteObjectById( Class<?> oClass, String id);
int insertIntoBySql(String sql);
}
... ...
package com.ruoyi.system.service.impl;
import com.ruoyi.system.mapper.PublicMapper;
import com.ruoyi.system.service.PublicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* 公用mapper
*/
@Service
public class PublicServiceImpl implements PublicService {
@Autowired
private PublicMapper publicMapper;
/**
* 添加对象
*/
public int insert(Object object)
{
return publicMapper.insert(object);
}
/**
* 指定表名添加
*/
public int insertToTable(Object object, String tableName)
{
return publicMapper.insertToTable(object,tableName);
}
/**
* 添加对象集合
*/
public int insertAll(List<?> list)
{
return publicMapper.insertAll(list);
}
/**
* 指定表名添加对象集合
*/
public int insertAllToTable(List<?> list, String tableName)
{
return publicMapper.insertAllToTable(list, tableName);
}
/**
* 更新对象不为空的属性
* @param object
* @param whereFieldNames
*/
public int updateObject(Object object, String whereFieldNames)
{
return publicMapper.updateObject(object,whereFieldNames);
}
/**
* 自定义sql更新
* @param sql
*/
public int updateBySql(String sql)
{
return publicMapper.updateBySql(sql);
}
/**
* 查询 通过条件查询
* @param clas
* @param idName
* @param values
* @return
*/
public <T> T getObject(Class<?> clas, String idName, String values)
{
return publicMapper.getObject(clas,idName,values);
}
/**
* 查询 通过条件查询
* @param clas
* @param idName
* @param values
* @return
*/
public <T> T getObjectForTableName(Class<T> clas, String idName, String values, String tableName)
{
return publicMapper.getObjectForTableName(clas,idName,values,tableName);
}
/**
* 查询 通过条件查询单个指定项目
* @param clas 類型
* @param select 查詢結果
* @param idName 主鍵名稱
* @param values 主鍵值
* @return
*/
public Map<String,Object> getObjectSelectTableName(Class<?> clas, String select, String idName, String values, String tableName)
{
return publicMapper.getObjectSelectTableName(clas,select,idName,values,tableName);
}
/**
* 查询list
* @param object
* @param whereMap 如果是时间,whereMap里面对应的字段比较符为time,同时添加一个end_字段名的值 表示是结束时间
* @param order
* @param pagetSize
* @param pageNo
* @return
*/
public List<Map<String,Object>> getObjectList(Object object, String selectStr, Map<String, String> whereMap, String order, Integer pagetSize, Integer pageNo)
{
return publicMapper.getObjectList(object,selectStr,whereMap,order,pagetSize,pageNo);
}
/**
* 查詢totle
* @param object
* @param whereMap 如果是时间,whereMap里面对应的字段比较符为time,同时添加一个end_字段名的值 表示是结束时间
* @return
*/
public Long getObjectListTotle(Object object, Map<String, String> whereMap)
{
return publicMapper.getObjectListTotle(object,whereMap);
}
/**
* 通过条件删除对象
* @param oClass
* @param map
*/
public int deleteObjectByContent(Class<?> oClass, Map<String, String> map)
{
return publicMapper.deleteObjectByContent(oClass,map);
}
/**
* 自定义sql语句查询list
* @param sql
* @return
*/
public List<Map<String,Object>> getObjectListBySQL(String sql)
{
return publicMapper.getObjectListBySQL(sql);
}
/**
* 添加或更新对象列表
* INSERT INTO `test` (`in1`,`str1`)VALUES ('1','2'),('2','2') ON DUPLICATE KEY UPDATE `in1`=VALUES(`in1`),`str1`=VALUES(`str1`);
* @param objectlist 对象列表
* @return
*/
public int saveOrUpdateObjectList(List<Object> objectlist)
{
return publicMapper.saveOrUpdateObjectList(objectlist);
}
/**
* 添加或更新对象
* INSERT INTO test(`in1`,`str1`) VALUES ('1','1');
* @param object 对象
* @return
*/
public int saveOrUpdateObject(Object object)
{
return publicMapper.saveOrUpdateObject(object);
}
/**
* 通过id删除数据
* @return
*/
public int deleteObjectById(Class<?> oClass, String id)
{
return publicMapper.deleteObjectById(oClass, id);
}
public int insertIntoBySql(String sql)
{
return publicMapper.insertIntoBySql(sql);
}
}
... ...