引入Bcrypt配置
登录操作需要验证密码,需要使用Bcrypt工具类来验证
package com.heima.wemedia.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan({"com.heima.common.aliyun","com.heima.common.exception","com.heima.common.knife4j","com.heima.common.bcrypt"})
public class InitConfig {
}
package com.heima.wemedia.service.impl;
使用BCryptPasswordEncoder提供的方法,比对密码
boolean b = encoder.matches(userLoginDto.getPassword(), adUser.getPassword());
获取登录用户思路分析--从当前线程中获取用户
添加工具类
在使用拦截器解析后的用户id需要放在当前线程中,可以使用工具类来实现,在heima-leadnews-common中添加如下类
package com.heima.common.threadlocal;
/** 存放用户id的容器 */
public class UserThreadLocalUtils {
private final static ThreadLocal<Integer> userThreadLocal = new ThreadLocal<>();
/** 获取线程中的用户 */
public static Integer getUserId() {
return userThreadLocal.get();
}
/** 设置当前线程中的用户 @param userId */
public static void setUserId(Integer userId) {
userThreadLocal.set(userId);
}
}
在自媒体wemedia微服务中使用拦截器解析header数据并设置到当前线程中
package com.heima.wemedia.interceptors;
@Slf4j
public class UserInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//得到header中的信息
String userId = request.getHeader("userId");
if(StringUtils.isNotBlank(userId)){
//把用户id存入threadloacl中
UserThreadLocalUtils.setUserId(Integer.valueOf(userId));
log.info("UserInterceptor设置用户信息到threadlocal中...");
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("清理threadlocal...");
UserThreadLocalUtils.removeUser();
}
}
配置拦截器
package com.heima.wemedia.config;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserInterceptor()).addPathPatterns("/**"); 所有
}
}
package com.heima.wemedia.controller.v1;
@RestController
@RequestMapping("/api/v1/material")
public class MaterialController {
@Autowired
private WmMaterialService wmMaterialService;
/** 上传文件 */
@PostMapping("/upload_picture")
public ResponseResult<String> uploadPic(@RequestParam(name = "multipartFile")MultipartFile file){
return ResponseResult.ok(wmMaterialService.uploadPicture(file));
}
}
package com.heima.wemedia.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.wemedia.entity.WmMaterial;
import org.springframework.web.multipart.MultipartFile;
public interface WmMaterialService extends IService<WmMaterial> {
/* 上传图片String接口* /
String uploadPicture(MultipartFile multipartFile);
}
import@Slf4j
@Service
public class WmMaterialServiceImpl extends ServiceImpl<WmMaterialMapper, WmMaterial> implements WmMaterialService {
@Autowired
private MinioService minioService;
@Override
public String uploadPicture(MultipartFile multipartFile) {
Integer userId = UserThreadLocalUtils.getUserId();
if(userId == null || userId==0){
throw new LeadException(AppHttpCodeEnum.NEED_LOGIN);
}
String suffix = StringUtils.substringAfterLast(multipartFile.getOriginalFilename(), ".");
// 新的文件名
String newFileName = UUID.randomUUID().toString() +suffix;
// 上传到minio
try {
String url = minioService.uploadImgFile("",newFileName,multipartFile.getInputStream());
// 保存数据库
WmMaterial wmMaterial = new WmMaterial();
wmMaterial.setUrl(url);
wmMaterial.setUserId(userId);
wmMaterial.setType(0);
wmMaterial.setIsCollection(false);
wmMaterial.setCreatedTime(new Date());
boolean b = save(wmMaterial);
if(!b){
throw new LeadException(AppHttpCodeEnum.SERVER_ERROR);
}
return url;
} catch (Exception e) {
log.error("oss 上传失败!");
e.printStackTrace();
throw new LeadException(AppHttpCodeEnum.UPLOAD_ERROR);
}
}
}