diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000000000000000000000000000000000000..adea408eb7acf08b3b35c32c955f4027736c37ef --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,69 @@ +node { + + stage('拉取gitee代码') { + //git branch: "${BRANCH}", credentialsId: 'a5809969-9357-49d7-84b9-72fbd1e8d902', url: 'https://gitee.com/cai-wangfa/cloud-shopping.git' + + git branch: "dev1", credentialsId: 'a5809969-9357-49d7-84b9-72fbd1e8d902', url: 'https://gitee.com/cai-wangfa/cvmagic-vue.git' + } + + stage('maven构建项目') { + //sh "mvn clean install -pl ${"${SERVICE}"} -am -amd -Pdev -Dmaven.test.skip=true" + sh "mvn clean install -pl cvmagic-admin -am -amd -Pdev -Dmaven.test.skip=true" + } + + stage('jar包上传,构建docker镜像运行') { + + /*def item = "${SERVICE}".split(",") + println item.toString() + for(int i=0;i redisTemplate; - - @GetMapping("/a") - public Object test(){ - Object o = redisTemplate.opsForValue().get("permission:3"); - System.out.println(JSON.toJSONString(o)); - - return 123; - } -} diff --git a/cvmagic-admin/src/main/java/com/cwf/admin/web/controller/system/KaptchaController.java b/cvmagic-admin/src/main/java/com/cwf/admin/web/controller/system/KaptchaController.java new file mode 100644 index 0000000000000000000000000000000000000000..f36c6c58e84b77ccdffe0635e2a5e000affc46fa --- /dev/null +++ b/cvmagic-admin/src/main/java/com/cwf/admin/web/controller/system/KaptchaController.java @@ -0,0 +1,37 @@ +package com.cwf.admin.web.controller.system; + + +import com.cwf.common.entity.http.R; +import com.cwf.framework.authcode.entity.KaptchaImageCodeEntity; +import com.cwf.framework.authcode.service.KaptchaService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; + +@RestController +@RequestMapping("/api/auth/code") +public class KaptchaController { + + + @Autowired + private KaptchaService kaptchaService; + + + /** + * @description 获取图形验证码 + * @author 18068 + * @date 2023/2/17 11:27 + * @return + */ + @RequestMapping("/image") + public R generateImageCode(){ + try { + KaptchaImageCodeEntity codeEntity = kaptchaService.generateImageCode(); + return R.success(codeEntity); + } catch (IOException e) { + return R.error("获取验证码失败"); + } + } +} diff --git a/cvmagic-admin/src/main/java/com/cwf/admin/web/controller/system/LoginController.java b/cvmagic-admin/src/main/java/com/cwf/admin/web/controller/system/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..026112bcb28a2712cb899049a9784dfdae520dd4 --- /dev/null +++ b/cvmagic-admin/src/main/java/com/cwf/admin/web/controller/system/LoginController.java @@ -0,0 +1,61 @@ +package com.cwf.admin.web.controller.system; + + +import com.cwf.common.entity.http.R; +import com.cwf.framework.authcode.service.KaptchaService; +import com.cwf.security.dao.UserLoginDao; +import com.cwf.security.entity.UserLogin; +import com.cwf.security.service.UserLoginService; +import com.cwf.security.validation.login.UserLoginRequestParam; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +@RestController +@RequestMapping("/admin") +@Valid +public class LoginController { + + + @Autowired + UserLoginService userLoginService; + + + @Autowired + KaptchaService kaptchaService; + + + @Autowired + UserLoginDao userLoginDao; + + @PostMapping("/login") + public R login(@RequestBody @Validated UserLoginRequestParam userLogin){ + + //检查验证码 + kaptchaService.checkImageCode(userLogin.getUuid(),userLogin.getCode()); + + + + UserLogin userInfo = UserLogin.builder() + .userName(userLogin.getUserName()) + .password(userLogin.getPassword()) + .build(); + + String token = userLoginService.login(userInfo); + + + + + + return R.success(token); + + + + + } +} diff --git a/cvmagic-admin/src/main/resources/application-dev.yml b/cvmagic-admin/src/main/resources/application-dev.yml index 647ed67cedb3915ea606b9b437f11e955cb057d0..34956c40bd2bc47c8c75313793da08c46666ea05 100644 --- a/cvmagic-admin/src/main/resources/application-dev.yml +++ b/cvmagic-admin/src/main/resources/application-dev.yml @@ -1,5 +1,5 @@ server: - port: 9001 + port: 3000 #开发环境 spring: diff --git a/cvmagic-common/src/main/java/com/cwf/common/handle/ExceptionHandler.java b/cvmagic-common/src/main/java/com/cwf/common/handle/ExceptionHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..2f18fea088e4d0de559669b7bfb2b7723f215ccd --- /dev/null +++ b/cvmagic-common/src/main/java/com/cwf/common/handle/ExceptionHandler.java @@ -0,0 +1,111 @@ +package com.cwf.common.handle; + +import com.cwf.common.entity.http.R; +import com.cwf.common.enums.ResCodeEnum; +import com.cwf.common.exception.base.MyException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +@SuppressWarnings("all") +@RestControllerAdvice() +@Slf4j +public class ExceptionHandler { + + + /** + * @description: 单参数验证 + * @param e + * @return: com.commons.utils.ResUtils + * @author 18068 + * @date: 2022/9/3 10:51 + */ + @org.springframework.web.bind.annotation.ExceptionHandler({ConstraintViolationException.class}) + @ResponseBody + public R exceptionHandler(ConstraintViolationException e) { + List list = new ArrayList<>(); + Set> constraintViolations = e.getConstraintViolations(); + + String msg = ""; + + for (ConstraintViolation s:constraintViolations){ + + String param = s.getPropertyPath().toString().split("\\.")[1]; + list.add(param+s.getMessage()); + + msg += param+s.getMessage()+";"; + + } + + return R.error(msg).writeCode(ResCodeEnum.PARAM_ERR.getCode()); + } + + /** + * @description: 实体类验证 + * @param e + * @return: com.commons.utils.ResUtils + * @author 18068 + * @date: 2022/9/3 10:51 + */ + @org.springframework.web.bind.annotation.ExceptionHandler({MethodArgumentNotValidException.class}) + @ResponseBody + public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + List result = new ArrayList(); + BindingResult bindingResult = e.getBindingResult(); + List fieldErrors = bindingResult.getFieldErrors(); + + String msg = ""; + + for (FieldError fieldError:fieldErrors){ + result.add(fieldError.getField()+fieldError.getDefaultMessage()); + msg += fieldError.getField()+fieldError.getDefaultMessage()+";"; + } + return R.error(msg).writeCode(ResCodeEnum.PARAM_ERR.getCode()); + } + + /** + * @description: 异常捕获 + * @param e + * @return: com.commons.utils.ResUtils + * @author 18068 + * @date: 2022/9/3 11:11 + */ +/* @ExceptionHandler({Exception.class}) + @ResponseBody + public ResUtils Exception(Exception e) { + System.out.println(e); + log.error(e.getMessage()); + return ResUtils.serviceError(); + } + + @ExceptionHandler({RuntimeException.class}) + @ResponseBody + public ResUtils runException(RuntimeException e) { + System.out.println(e); + log.error(e.getMessage()); + return ResUtils.serviceError(); + }*/ + + /** + * @description: 自定义异常捕获 + * @param e + * @return: com.commons.utils.ResUtils + * @author 18068 + * @date: 2022/9/3 11:11 + */ + @org.springframework.web.bind.annotation.ExceptionHandler({MyException.class}) + @ResponseBody + public R handleMethodArgumentNotValidException(MyException e) { + System.out.println(e.getCode()); + return R.error().writeMsg(e.getMessage()).writeCode(e.getCode()).writeData(null); + } +} diff --git a/cvmagic-framework/pom.xml b/cvmagic-framework/pom.xml index d974b38515ee1989a575576daa804333a42a3c59..b36149b72b1504a2cf5e33d715d41fbd09ffa2fd 100644 --- a/cvmagic-framework/pom.xml +++ b/cvmagic-framework/pom.xml @@ -71,6 +71,13 @@ lombok + + + + com.github.penggle + kaptcha + + diff --git a/cvmagic-framework/src/main/java/com/cwf/framework/authcode/config/KaptchaConfig.java b/cvmagic-framework/src/main/java/com/cwf/framework/authcode/config/KaptchaConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..438e0e86a5f1b92af4dc9c40cedc670116a2f283 --- /dev/null +++ b/cvmagic-framework/src/main/java/com/cwf/framework/authcode/config/KaptchaConfig.java @@ -0,0 +1,48 @@ +package com.cwf.framework.authcode.config; + +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Properties; + + +@SuppressWarnings("all") +@Configuration +public class KaptchaConfig { + @Bean + public DefaultKaptcha getKaptcha() { + //验证码生成器 + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + //配置 + Properties properties = new Properties(); + //是否有边框 + properties.setProperty("kaptcha.border", "yes"); + //设置边框颜色 + properties.setProperty("kaptcha.border.color", "105,179,90"); + //边框粗细度,默认为1 + // properties.setProperty("kaptcha.border.thickness","1"); + //验证码 + properties.setProperty("kaptcha.session.key", "code"); + //验证码文本字符颜色 默认为黑色 + properties.setProperty("kaptcha.textproducer.font.color", "blue"); + //设置字体样式 + properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅 黑"); + //字体大小,默认40 + properties.setProperty("kaptcha.textproducer.font.size", "30"); + //验证码文本字符内容范围 默认为abced2345678gfynmnpwx + // properties.setProperty("kaptcha.textproducer.char.string", ""); + //字符长度,默认为5 + properties.setProperty("kaptcha.textproducer.char.length", "4"); + //字符间距 默认为2 + properties.setProperty("kaptcha.textproducer.char.space", "5"); + //验证码图片宽度 默认为200 + properties.setProperty("kaptcha.image.width", "100"); + //验证码图片高度 默认为40 + properties.setProperty("kaptcha.image.height", "50"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/cvmagic-framework/src/main/java/com/cwf/framework/authcode/entity/KaptchaImageCodeEntity.java b/cvmagic-framework/src/main/java/com/cwf/framework/authcode/entity/KaptchaImageCodeEntity.java new file mode 100644 index 0000000000000000000000000000000000000000..be3e772327853e1b81de130f1b82d3f06c4526aa --- /dev/null +++ b/cvmagic-framework/src/main/java/com/cwf/framework/authcode/entity/KaptchaImageCodeEntity.java @@ -0,0 +1,21 @@ +package com.cwf.framework.authcode.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.SuperBuilder; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder +@ToString +public class KaptchaImageCodeEntity { + + private String uuid; + + private String image; + + +} diff --git a/cvmagic-framework/src/main/java/com/cwf/framework/authcode/service/KaptchaService.java b/cvmagic-framework/src/main/java/com/cwf/framework/authcode/service/KaptchaService.java new file mode 100644 index 0000000000000000000000000000000000000000..641f1582dbedb3df2c720424bcb1ab9ae946d25c --- /dev/null +++ b/cvmagic-framework/src/main/java/com/cwf/framework/authcode/service/KaptchaService.java @@ -0,0 +1,34 @@ +package com.cwf.framework.authcode.service; + +import com.cwf.framework.authcode.entity.KaptchaImageCodeEntity; + +import java.io.IOException; + +/** + * @description 图形验证码服务 + * @author 18068 + * @date 2023/2/17 13:24 + */ +public interface KaptchaService { + + + /** + * @param + * @return + * @description 生成图形验证码 + * @author 18068 + * @date 2023/2/17 10:34 + */ + KaptchaImageCodeEntity generateImageCode() throws IOException; + + + /** + * @description 检查验证码是否正确 + * @param uuid 验证码标识 + * @param code 验证码 + * @author 18068 + * @date 2023/2/17 12:43 + * @return + */ + boolean checkImageCode(String uuid,String code); +} diff --git a/cvmagic-framework/src/main/java/com/cwf/framework/authcode/service/impl/KaptchaServiceImpl.java b/cvmagic-framework/src/main/java/com/cwf/framework/authcode/service/impl/KaptchaServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..cfce34d48ba220622ff467b2145bc07053c3c94c --- /dev/null +++ b/cvmagic-framework/src/main/java/com/cwf/framework/authcode/service/impl/KaptchaServiceImpl.java @@ -0,0 +1,100 @@ +package com.cwf.framework.authcode.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.cwf.common.enums.ResCodeEnum; +import com.cwf.common.exception.base.MyException; +import com.cwf.common.utils.id.IdUtil; +import com.cwf.framework.authcode.entity.KaptchaImageCodeEntity; +import com.cwf.framework.authcode.service.KaptchaService; +import com.cwf.framework.redis.RedisService; +import com.google.code.kaptcha.impl.DefaultKaptcha; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import sun.misc.BASE64Encoder; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Service +public class KaptchaServiceImpl implements KaptchaService { + + + private String mark ="Kaptcha:"; + + + @Autowired + DefaultKaptcha defaultKaptcha; + + + @Autowired + RedisService redisTemplate; + + + @Override + public KaptchaImageCodeEntity generateImageCode() throws IOException { + + + ByteArrayOutputStream out; + //生成UUID + String key = IdUtil.randomUUID(); + //生成验证码 + String text = defaultKaptcha.createText(); + + BufferedImage image = defaultKaptcha.createImage(text); + + out = new ByteArrayOutputStream(); + ImageIO.write(image, "jpg", out); + BASE64Encoder base64Encoder = new BASE64Encoder(); + + + log.info("\n生成验证码{}\nuuid: {}", text,key); + + String redisKey = mark + key; + + try { + redisTemplate.setCacheObject(redisKey, text, 300, TimeUnit.SECONDS); + } catch (Exception e) { + throw new MyException("验证码获取失败", 400); + } + + //生成验证码信息 + KaptchaImageCodeEntity codeEntity = KaptchaImageCodeEntity.builder() + .uuid(key) + .image("data:image/jpg;base64," + base64Encoder.encode(out.toByteArray()).trim().replace("\n", "").replace("\r", "")) + .build(); + + return codeEntity; + } + + + @Override + public boolean checkImageCode(String uuid, String code) { + + String key = mark + uuid; + + String redisCode = redisTemplate.getCacheObject(key); + + log.info("\n前台验证码: {}", code); + log.info("\nredis验证码:{}", redisCode); + + + if (redisCode == null){ + throw new MyException("验证码过期", ResCodeEnum.ERROR.getCode()); + } + + if (redisCode.equals(code)) { + log.info("\n验证码检验成功"); + return true; + } else { + throw new MyException("验证码错误", ResCodeEnum.ERROR.getCode()); + } + } +} diff --git a/cvmagic-framework/src/main/java/com/cwf/framework/redis/RedisService.java b/cvmagic-framework/src/main/java/com/cwf/framework/redis/RedisService.java new file mode 100644 index 0000000000000000000000000000000000000000..0aaa25bd19ac431d9e347b431e29b495521dd9b7 --- /dev/null +++ b/cvmagic-framework/src/main/java/com/cwf/framework/redis/RedisService.java @@ -0,0 +1,262 @@ +package com.cwf.framework.redis; + + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +@Service +@Component +public class RedisService +{ + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) + { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) + { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) + { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) + { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获取有效时间 + * + * @param key Redis键 + * @return 有效时间 + */ + public long getExpire(final String key) + { + return redisTemplate.getExpire(key); + } + + /** + * 判断 key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public Boolean hasKey(String key) + { + return redisTemplate.hasKey(key); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public T getCacheObject(final String key) + { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject(final String key) + { + return redisTemplate.delete(key); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * @return + */ + public boolean deleteObject(final Collection collection) + { + return redisTemplate.delete(collection) > 0; + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long setCacheList(final String key, final List dataList) + { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) + { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) + { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) + { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) + { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) + { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) + { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) + { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public T getCacheMapValue(final String key, final String hKey) + { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) + { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 删除Hash中的某条数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return 是否成功 + */ + public boolean deleteCacheMapValue(final String key, final String hKey) + { + return redisTemplate.opsForHash().delete(key, hKey) > 0; + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) + { + return redisTemplate.keys(pattern); + } +} diff --git a/cvmagic-security/src/main/java/com/cwf/security/config/SecurityConfig.java b/cvmagic-security/src/main/java/com/cwf/security/config/SecurityConfig.java index 51b908bed0819a75a4b42eaac0b4d8f1c52d6d16..223f56cd0fffbd9c05cdf2f4b18981732284e94f 100644 --- a/cvmagic-security/src/main/java/com/cwf/security/config/SecurityConfig.java +++ b/cvmagic-security/src/main/java/com/cwf/security/config/SecurityConfig.java @@ -55,7 +55,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .authorizeRequests() //允许登录接口匿名访问 .antMatchers("/user/login").permitAll() - .antMatchers("/**/api/**").permitAll() + .antMatchers("/admin/login").permitAll() + .antMatchers("/api/**").permitAll() .antMatchers("/websocket/**").permitAll() //除此之外的所有接口需要鉴权认证 diff --git a/cvmagic-security/src/main/java/com/cwf/security/dao/UserLoginDao.java b/cvmagic-security/src/main/java/com/cwf/security/dao/UserLoginDao.java new file mode 100644 index 0000000000000000000000000000000000000000..24454b0d363e1b93588ddfa97b6440f658d6884b --- /dev/null +++ b/cvmagic-security/src/main/java/com/cwf/security/dao/UserLoginDao.java @@ -0,0 +1,28 @@ +package com.cwf.security.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cwf.security.entity.User; +import com.cwf.security.entity.UserLogin; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +/** + * (UserLogin)表数据库访问层 + * + * @author makejava + * @since 2023-02-17 08:55:42 + */ +@Mapper +public interface UserLoginDao extends BaseMapper { + + /** + * 通过用户名查询用户基本信息 + * + * @param loginName 用户名 + * @return 实例对象 + */ + @Select("select * from user_login\n" + + "where user_name=#{username}") + UserLogin userDetails(String loginName); +} + diff --git a/cvmagic-security/src/main/java/com/cwf/security/entity/SecurityUser.java b/cvmagic-security/src/main/java/com/cwf/security/entity/SecurityUser.java index 7dc410dd7fa064310e4174ba10cc222617f8b74a..91839a7fc1b2659a5e10c590c041ca28bf89e890 100644 --- a/cvmagic-security/src/main/java/com/cwf/security/entity/SecurityUser.java +++ b/cvmagic-security/src/main/java/com/cwf/security/entity/SecurityUser.java @@ -19,7 +19,7 @@ import java.util.stream.Collectors; public class SecurityUser implements UserDetails { //用户信息 - private User user; + private UserLogin user; //用户权限列表 private List permissions; @@ -51,7 +51,7 @@ public class SecurityUser implements UserDetails { } public String getUserID() { - return user.getUserId(); + return user.getId(); } @Override diff --git a/cvmagic-security/src/main/java/com/cwf/security/entity/UserLogin.java b/cvmagic-security/src/main/java/com/cwf/security/entity/UserLogin.java new file mode 100644 index 0000000000000000000000000000000000000000..de2961eb21c342dc70b032057773cb4bc6e63965 --- /dev/null +++ b/cvmagic-security/src/main/java/com/cwf/security/entity/UserLogin.java @@ -0,0 +1,68 @@ +package com.cwf.security.entity; + +import java.util.Date; + +import com.cwf.security.validation.login.UserLoginGroup; +import lombok.*; +import lombok.experimental.SuperBuilder; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * (UserLogin)实体类 + * + * @author makejava + * @since 2023-02-17 08:55:42 + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder +@ToString +public class UserLogin implements Serializable { + private static final long serialVersionUID = -60951295976241654L; + /** + * 用户id + */ + private String id; + /** + * 用户名 + */ + private String userName; + /** + * 密码 + */ + private String password; + + + /** + * 昵称 + */ + private String name; + /** + * 头像 + */ + private String avatarUrl; + /** + * 用户状态 + */ + private Integer state; + /** + * 逻辑删除 + */ + private Integer isDelete; + /** + * 创建时间 + */ + private Date createTime; + /** + * 更新时间 + */ + private Date updateTime; + + +} + diff --git a/cvmagic-security/src/main/java/com/cwf/security/filter/JwtAuthenticationTokenFilter.java b/cvmagic-security/src/main/java/com/cwf/security/filter/JwtAuthenticationTokenFilter.java index ecbf5668bd2703e1eff5ab92ba23ceafdf377a22..397e25c8561f6165a421a8fceb19dc175c6e4ea2 100644 --- a/cvmagic-security/src/main/java/com/cwf/security/filter/JwtAuthenticationTokenFilter.java +++ b/cvmagic-security/src/main/java/com/cwf/security/filter/JwtAuthenticationTokenFilter.java @@ -6,6 +6,7 @@ import com.cwf.common.enums.TokenInfoKeyEnum; import com.cwf.common.utils.auth.JwtUtil; import com.cwf.security.entity.SecurityUser; import com.cwf.security.entity.User; +import com.cwf.security.entity.UserLogin; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -44,11 +45,14 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { String token = request.getHeader("Authorization"); + System.out.println(token); + + TokenInfo userInfo = JwtUtil.getTokenInfo(token, TokenInfoKeyEnum.OK.getCode()); - User user = new User(); + UserLogin user = new UserLogin(); Optional.ofNullable("").ifPresent(v -> { //获取用户id diff --git a/cvmagic-security/src/main/java/com/cwf/security/service/UserLoginService.java b/cvmagic-security/src/main/java/com/cwf/security/service/UserLoginService.java new file mode 100644 index 0000000000000000000000000000000000000000..773234c7bfafe66df61ba98b9f91835ebceaaa41 --- /dev/null +++ b/cvmagic-security/src/main/java/com/cwf/security/service/UserLoginService.java @@ -0,0 +1,24 @@ +package com.cwf.security.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.cwf.security.entity.UserLogin; + +/** + * (UserLogin)表服务接口 + * + * @author makejava + * @since 2023-02-17 08:55:42 + */ +public interface UserLoginService extends IService { + + + + /** + * @return + * @description 用户登入 + * @author 18068 + * @date 2023/2/17 8:46 + */ + String login(UserLogin userLogin); +} + diff --git a/cvmagic-security/src/main/java/com/cwf/security/service/impl/UserDetailsServiceImpl.java b/cvmagic-security/src/main/java/com/cwf/security/service/impl/UserDetailsServiceImpl.java index b57c00e03da47a3a1668d9cc74ea49f1ff520996..15a13ff362918632c2bd6967055df99ba050539c 100644 --- a/cvmagic-security/src/main/java/com/cwf/security/service/impl/UserDetailsServiceImpl.java +++ b/cvmagic-security/src/main/java/com/cwf/security/service/impl/UserDetailsServiceImpl.java @@ -2,8 +2,10 @@ package com.cwf.security.service.impl; import com.cwf.security.dao.LoginDao; +import com.cwf.security.dao.UserLoginDao; import com.cwf.security.entity.SecurityUser; import com.cwf.security.entity.User; +import com.cwf.security.entity.UserLogin; import com.cwf.security.service.PermissionListService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -31,7 +33,7 @@ public class UserDetailsServiceImpl implements UserDetailsService { RedisTemplate redisTemplate; @Autowired - LoginDao loginDao; + UserLoginDao loginDao; @Autowired PermissionListService permissionListService; @@ -44,36 +46,40 @@ public class UserDetailsServiceImpl implements UserDetailsService { public UserDetails loadUserByUsername(String loginName) { - final User user = loginDao.userDetails(loginName); + UserLogin user = loginDao.userDetails(loginName); - List permissionList = null; - - try { - permissionList = Optional.ofNullable(user).map(v -> { - //获取当前用户权限列表 - List permissions = permissionListService.permissionList(user.getUserId()); - - if (permissions.size()!=0) return permissions; - return new ArrayList(); - //处理 - }).get(); + System.out.println(user); - log.info("\n当前用户用户名: {}",loginName); - log.info("\n当前登录用户获取权限列: {}",permissionList); - //redis权限列表缓存 - String key = "permission:"+user.getUserId(); - - try { - redisTemplate.opsForValue().set(key,permissionList); - }catch (Exception e){ - log.error("id为{}的用户缓存权限列表失败,请检查redis是否正常",user.getUserId()); - } + List permissionList = null; - }catch (Exception e){ - log.error("\n当前登录用户获取权限列表异常"); - } +// try { +// permissionList = Optional.ofNullable(user).map(v -> { +// //获取当前用户权限列表 +// List permissions = permissionListService.permissionList(user.getId()); +// +// if (permissions.size()!=0) return permissions; +// +// return new ArrayList(); +// //处理 +// }).get(); +// +// log.info("\n当前用户用户名: {}",loginName); +// log.info("\n当前登录用户获取权限列: {}",permissionList); +// +// //redis权限列表缓存 +// String key = "permission:"+user.getId(); +// +// try { +// redisTemplate.opsForValue().set(key,permissionList); +// }catch (Exception e){ +// log.error("id为{}的用户缓存权限列表失败,请检查redis是否正常",user.getId()); +// } +// +// }catch (Exception e){ +// log.error("\n当前登录用户获取权限列表异常"); +// } diff --git a/cvmagic-security/src/main/java/com/cwf/security/service/impl/UserLoginServiceImpl.java b/cvmagic-security/src/main/java/com/cwf/security/service/impl/UserLoginServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..da399e77964ea7ca793e94d0991f44811cc72b10 --- /dev/null +++ b/cvmagic-security/src/main/java/com/cwf/security/service/impl/UserLoginServiceImpl.java @@ -0,0 +1,76 @@ +package com.cwf.security.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.cwf.common.entity.auth.TokenInfo; +import com.cwf.common.enums.ResCodeEnum; +import com.cwf.common.exception.base.MyException; +import com.cwf.common.utils.auth.JwtUtil; +import com.cwf.framework.redis.RedisService; +import com.cwf.security.dao.UserLoginDao; +import com.cwf.security.entity.SecurityUser; +import com.cwf.security.entity.UserLogin; +import com.cwf.security.service.UserLoginService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Service; + +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +/** + * (UserLogin)表服务实现类 + * + * @author makejava + * @since 2023-02-17 08:55:42 + */ + +@Slf4j +@Service("userLoginService") +public class UserLoginServiceImpl extends ServiceImpl implements UserLoginService { + + + + + + @Autowired + AuthenticationManager authenticationManager; + + @Autowired + RedisService redisService; + + @Override + public String login(UserLogin user) { + + UsernamePasswordAuthenticationToken token =new UsernamePasswordAuthenticationToken(user.getUserName(),user.getPassword()); + Authentication authenticate = authenticationManager.authenticate(token); + + + if (Objects.isNull(authenticate)){ + log.error("登入失败"); + }else { + log.info("密码验证成功"); + } + + SecurityUser principal = (SecurityUser) authenticate.getPrincipal(); + + TokenInfo tokenInfo = new TokenInfo(); + + tokenInfo.setUserId(principal.getUserID()); + tokenInfo.setUserName(principal.getUsername()); + + String tokenStr = JwtUtil.getToken(tokenInfo); + + String redisKey = "token:"+principal.getUserID(); + + try { + redisService.setCacheObject(redisKey,tokenStr,7, TimeUnit.DAYS); + }catch (Exception e){ + throw new MyException("登入失败", ResCodeEnum.LOGIN_ERR.getCode()); + } + return tokenStr; + } +} + diff --git a/cvmagic-security/src/main/java/com/cwf/security/validation/login/UserLoginGroup.java b/cvmagic-security/src/main/java/com/cwf/security/validation/login/UserLoginGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..c26f91167ac8279ed5aa18a6bb0e59d23bb24d06 --- /dev/null +++ b/cvmagic-security/src/main/java/com/cwf/security/validation/login/UserLoginGroup.java @@ -0,0 +1,16 @@ +package com.cwf.security.validation.login; + +public class UserLoginGroup { + + public interface add{ + + } + + public interface update{ + + } + + public interface login{ + + } +} diff --git a/cvmagic-security/src/main/java/com/cwf/security/validation/login/UserLoginRequestParam.java b/cvmagic-security/src/main/java/com/cwf/security/validation/login/UserLoginRequestParam.java new file mode 100644 index 0000000000000000000000000000000000000000..99e334e4c8a3ec871225ab88ca6c21de23fb6b7e --- /dev/null +++ b/cvmagic-security/src/main/java/com/cwf/security/validation/login/UserLoginRequestParam.java @@ -0,0 +1,32 @@ +package com.cwf.security.validation.login; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.SuperBuilder; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder +@ToString +public class UserLoginRequestParam { + + + @NotBlank + @Length(min = 6,max = 11) + private String userName; + + @NotBlank + @Length(min = 6,max = 20) + private String password; + + private String uuid; + + private String code; +} diff --git a/cvmagic-system/src/main/java/com/cwf/system/controller/PermissionController.java b/cvmagic-system/src/main/java/com/cwf/system/controller/PermissionController.java index ed6707068880a19ad0ba0292eaa5e1725d9c7d86..1c92d733d43414bfc23966b77bd656eba6c338d6 100644 --- a/cvmagic-system/src/main/java/com/cwf/system/controller/PermissionController.java +++ b/cvmagic-system/src/main/java/com/cwf/system/controller/PermissionController.java @@ -46,6 +46,6 @@ public class PermissionController extends BaseController { String userId = getUserId(); - return R.success(userId); + return R.success(permissionTreeVOList); } } diff --git a/cvmagic-system/src/main/java/com/cwf/system/validation/login/UserLoginGroup.java b/cvmagic-system/src/main/java/com/cwf/system/validation/login/UserLoginGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..27120ba0cfabdabcfbea94883207f0e4d35d4169 --- /dev/null +++ b/cvmagic-system/src/main/java/com/cwf/system/validation/login/UserLoginGroup.java @@ -0,0 +1,12 @@ +package com.cwf.system.validation.login; + +public class UserLoginGroup { + + public interface add{ + + } + + public interface update{ + + } +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..bd38cae07ef2edb666fd3c5bec27e18eb4766fbc --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,8 @@ +version: "3" +services: + cvmagic-admin: + build: + context: cvmagic-admin + dockerfile: Dockerfile + ports: + - "3000:3000" \ No newline at end of file diff --git a/pom.xml b/pom.xml index b40fe04cd4f5c89fcbc8f1ce6b37c1233224d87a..66a3e96d6bd4847693dcf9779aa19c4484bf1564 100644 --- a/pom.xml +++ b/pom.xml @@ -169,6 +169,13 @@ + + org.slf4j + slf4j-api + 1.7.30 + + +