加密视频验证

This commit is contained in:
wangjinlei
2024-04-24 11:09:09 +08:00
parent ba2fa6baf3
commit 872b9939f9
6 changed files with 131 additions and 1 deletions

View File

@@ -293,6 +293,11 @@
<artifactId>springfox-swagger2</artifactId> <artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version> <version>${swagger.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>vod20170321</artifactId>
<version>2.20.0</version>
</dependency>
<dependency> <dependency>
<groupId>io.springfox</groupId> <groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId> <artifactId>springfox-swagger-ui</artifactId>

View File

@@ -0,0 +1,45 @@
package com.peanut.common.utils;
import com.aliyun.tea.TeaException;
import com.aliyun.teautil.models.RuntimeOptions;
import com.aliyun.vod20170321.Client;
import com.aliyun.vod20170321.models.GetVideoPlayAuthRequest;
import com.aliyun.vod20170321.models.GetVideoPlayAuthResponse;
public class SpdbUtil {
public static String getPlayAuth(String vid) throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId("LTAI5tMKmWhPfnPsz2J3bfxL")
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret("doFUplbiIxL6PgJME3eSaW8G6HauuC");
// Endpoint 请参考 https://api.aliyun.com/product/vod
config.endpoint = "vod.cn-shanghai.aliyuncs.com";
Client client = new Client(config);
GetVideoPlayAuthRequest getVideoPlayAuthRequest = new GetVideoPlayAuthRequest().setVideoId(vid).setAuthInfoTimeout(1000L);;
RuntimeOptions runtimeOptions = new RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
GetVideoPlayAuthResponse videoPlayAuthWithOptions = client.getVideoPlayAuthWithOptions(getVideoPlayAuthRequest, runtimeOptions);
return videoPlayAuthWithOptions.getBody().getPlayAuth();
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
return "error";
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
return "error";
}
}
}

View File

@@ -1,5 +1,6 @@
package com.peanut.modules.common.entity; package com.peanut.modules.common.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
@@ -26,4 +27,7 @@ public class CourseCatalogueChapterVideoEntity {
@TableLogic @TableLogic
private Integer delFlag; private Integer delFlag;
@TableField(exist = false)
private String playAuth;
} }

View File

@@ -7,4 +7,6 @@ import com.peanut.modules.common.to.ParamTo;
public interface CourseCatalogueChapterVideoService extends IService<CourseCatalogueChapterVideoEntity> { public interface CourseCatalogueChapterVideoService extends IService<CourseCatalogueChapterVideoEntity> {
Page getCourseCatalogueChapterVideoList(ParamTo param); Page getCourseCatalogueChapterVideoList(ParamTo param);
CourseCatalogueChapterVideoEntity checkVideo(CourseCatalogueChapterVideoEntity video) throws Exception;
} }

View File

@@ -3,17 +3,35 @@ package com.peanut.modules.master.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.peanut.common.utils.ShiroUtils;
import com.peanut.common.utils.SpdbUtil;
import com.peanut.modules.common.dao.CourseCatalogueChapterDao;
import com.peanut.modules.common.dao.CourseCatalogueChapterVideoDao; import com.peanut.modules.common.dao.CourseCatalogueChapterVideoDao;
import com.peanut.modules.common.dao.CourseCatalogueDao;
import com.peanut.modules.common.dao.UserToCourseDao;
import com.peanut.modules.common.entity.CourseCatalogueChapterEntity;
import com.peanut.modules.common.entity.CourseCatalogueChapterVideoEntity; import com.peanut.modules.common.entity.CourseCatalogueChapterVideoEntity;
import com.peanut.modules.common.entity.CourseCatalogueEntity;
import com.peanut.modules.common.entity.UserToCourseEntity;
import com.peanut.modules.common.to.ParamTo; import com.peanut.modules.common.to.ParamTo;
import com.peanut.modules.master.service.CourseCatalogueChapterVideoService; import com.peanut.modules.master.service.CourseCatalogueChapterVideoService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.xml.ws.soap.Addressing;
import java.util.Date;
import java.util.List;
@Slf4j @Slf4j
@Service("masterCourseCatalogueChapterVideoService") @Service("masterCourseCatalogueChapterVideoService")
public class CourseCatalogueChapterVideoServiceImpl extends ServiceImpl<CourseCatalogueChapterVideoDao, CourseCatalogueChapterVideoEntity> implements CourseCatalogueChapterVideoService { public class CourseCatalogueChapterVideoServiceImpl extends ServiceImpl<CourseCatalogueChapterVideoDao, CourseCatalogueChapterVideoEntity> implements CourseCatalogueChapterVideoService {
@Autowired
private CourseCatalogueChapterDao courseCatalogueChapterDao;
@Autowired
private CourseCatalogueDao courseCatalogueDao;
@Autowired
private UserToCourseDao userToCourseDao;
@Override @Override
public Page getCourseCatalogueChapterVideoList(ParamTo param) { public Page getCourseCatalogueChapterVideoList(ParamTo param) {
LambdaQueryWrapper<CourseCatalogueChapterVideoEntity> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<CourseCatalogueChapterVideoEntity> wrapper = new LambdaQueryWrapper<>();
@@ -22,4 +40,32 @@ public class CourseCatalogueChapterVideoServiceImpl extends ServiceImpl<CourseCa
Page<CourseCatalogueChapterVideoEntity> page = this.page(new Page<>(param.getPage(), param.getLimit()), wrapper); Page<CourseCatalogueChapterVideoEntity> page = this.page(new Page<>(param.getPage(), param.getLimit()), wrapper);
return page; return page;
} }
@Override
public CourseCatalogueChapterVideoEntity checkVideo(CourseCatalogueChapterVideoEntity video) throws Exception {
CourseCatalogueChapterEntity courseCatalogueChapterEntity = courseCatalogueChapterDao.selectById(video.getChapterId());
CourseCatalogueEntity courseCatalogueEntity = courseCatalogueDao.selectById(courseCatalogueChapterEntity.getCatalogueId());
Integer uId = ShiroUtils.getUId();
List<UserToCourseEntity> userToCourseEntities = userToCourseDao.selectList(new LambdaQueryWrapper<UserToCourseEntity>().eq(UserToCourseEntity::getUserId, uId).eq(UserToCourseEntity::getCourseId, courseCatalogueEntity.getCourseId()));
//用户课程足迹
if(userToCourseEntities.size()!=0){
UserToCourseEntity userToCourseEntity = userToCourseEntities.get(0);
userToCourseEntity.setUpdateTime(new Date());
userToCourseDao.updateById(userToCourseEntity);
}else{
UserToCourseEntity userToCourseEntity = new UserToCourseEntity();
userToCourseEntity.setUserId(uId);
userToCourseEntity.setCourseId(courseCatalogueEntity.getCourseId());
userToCourseEntity.setCreateTime(new Date());
userToCourseEntity.setUpdateTime(new Date());
userToCourseDao.insert(userToCourseEntity);
}
//加密视频组装playauth
if(video.getType()==1){
String playAuth = SpdbUtil.getPlayAuth(video.getVideo());
video.setPlayAuth(playAuth);
}
return video;
}
} }

View File

@@ -1,11 +1,19 @@
package com.peanut.modules.sociology.controller; package com.peanut.modules.sociology.controller;
import com.aliyun.tea.TeaException;
import com.aliyun.teautil.models.RuntimeOptions;
import com.aliyun.vod20170321.Client;
import com.aliyun.vod20170321.models.*;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.peanut.common.utils.R; import com.peanut.common.utils.R;
import com.peanut.common.utils.ShiroUtils; import com.peanut.common.utils.ShiroUtils;
import com.peanut.common.utils.SpdbUtil;
import com.peanut.modules.common.dao.CourseCatalogueChapterVideoDao;
import com.peanut.modules.common.entity.CourseCatalogueChapterEntity; import com.peanut.modules.common.entity.CourseCatalogueChapterEntity;
import com.peanut.modules.common.entity.CourseCatalogueChapterVideoEntity;
import com.peanut.modules.common.entity.CourseEntity; import com.peanut.modules.common.entity.CourseEntity;
import com.peanut.modules.common.to.ParamTo; import com.peanut.modules.common.to.ParamTo;
import com.peanut.modules.master.service.CourseCatalogueChapterVideoService;
import com.peanut.modules.sociology.service.CourseCatalogueChapterService; import com.peanut.modules.sociology.service.CourseCatalogueChapterService;
import com.peanut.modules.sociology.service.CourseService; import com.peanut.modules.sociology.service.CourseService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -26,6 +34,8 @@ public class CourseController {
private CourseService courseService; private CourseService courseService;
@Autowired @Autowired
private CourseCatalogueChapterService courseCatalogueChapterService; private CourseCatalogueChapterService courseCatalogueChapterService;
@Autowired
private CourseCatalogueChapterVideoService courseCatalogueChapterVideoService;
/** /**
* 获取用户最近学习课程列表 * 获取用户最近学习课程列表
@@ -95,4 +105,22 @@ public class CourseController {
return R.ok().put("chapterList",courseCatalogueChapterList); return R.ok().put("chapterList",courseCatalogueChapterList);
} }
@RequestMapping("/getPlayAuth")
public R getPlayAuth(@RequestBody Map<String,String> map) throws Exception {
String playAuth = SpdbUtil.getPlayAuth(map.get("vid"));
return R.ok().put("playAuth",playAuth);
}
/**
* 验证video权限并解决足迹加密视频签名问题
* @param video
* @return
* @throws Exception
*/
@RequestMapping("/checkVideo")
public R checkVideo(@RequestBody CourseCatalogueChapterVideoEntity video) throws Exception {
CourseCatalogueChapterVideoEntity courseCatalogueChapterVideoEntity = courseCatalogueChapterVideoService.checkVideo(video);
return R.ok().put("video",courseCatalogueChapterVideoEntity);
}
} }