diff --git a/pom.xml b/pom.xml index 579f5ddeb..301e7cf4e 100644 --- a/pom.xml +++ b/pom.xml @@ -209,10 +209,11 @@ ruoyi-admin ruoyi-framework + ruoyi-sso ruoyi-system ruoyi-quartz ruoyi-generator - ruoyi-common + ruoyi-common pom diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 068dcd677..d7c9de421 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -72,7 +72,19 @@ com.ruoyi ruoyi-generator - + + + org.jodd + jodd-core + 5.1.4 + + + + org.jodd + jodd-http + 5.1.4 + + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SsoApiController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SsoApiController.java new file mode 100644 index 000000000..724ec7e9f --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SsoApiController.java @@ -0,0 +1,87 @@ +package com.ruoyi.web.controller.api; + +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.exception.BusinessException; +import com.ruoyi.common.utils.DESUtil; +import com.ruoyi.sso.domain.SsoApplication; +import com.ruoyi.sso.service.ISsoApplicationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import jodd.http.HttpRequest; +import jodd.http.HttpResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; + +@Api("单点登录") +@Controller +@RequestMapping("/api/sso") +public class SsoApiController extends BaseController { + + private Logger logger = LoggerFactory.getLogger(SsoApiController.class); + + @Autowired + private ISsoApplicationService iSsoApplicationService; + + private final String JXSR_CLIENT_ID = "4802e571a8c94cd9921bc77cd8bf6084"; + private final String JXSR_SSO_API_KEY = "sr_sso_manager_2020020211000011"; + + @ApiOperation("重定向至省网登录") + @GetMapping(value = "/redirectUrl") + public String redirectUrl(@ApiParam(value = "应用标识", type = "String", required = true) String appKey, + @ApiParam(value = "应用密钥", type = "String", required = true) String appSecret) throws Exception { + logger.info("appKey = {} ----- appSecret = {}", appKey, appSecret); + SsoApplication queryObject = new SsoApplication(); + queryObject.setAppKey(appKey); + queryObject.setAppSecret(appSecret); + List ssoApplications = iSsoApplicationService.querySsoApplicationByAppKeyAndSecret(queryObject); + if (!CollectionUtils.isEmpty(ssoApplications)) { + SsoApplication ssoApplication = ssoApplications.get(0); + JSONObject queryParamObject = new JSONObject(); + queryParamObject.put("appKey", ssoApplication.getAppKey()); + String s = queryParamObject.toString(); + String resultQueryStr = DESUtil.encrypt(s, JXSR_SSO_API_KEY); + return "redirect:https://login.jxzwfww.gov.cn/auth2/authorize.do?redirect_uri=" + resultQueryStr + "&client_id=" + JXSR_CLIENT_ID; + } + throw new BusinessException("应用不存在!"); + } + + @ApiOperation("重定向至各个应用回调地址") + @GetMapping(value = "/ssoCallBack") + public String ssoCallBack(@ApiParam(value = "回调应用加密信息", type = "String") String redirect_uri, + @ApiParam(value = "用于搜索数据的ticket", type = "String") String ticket, + @ApiParam(value = "登录类型", type = "String") String logintype) throws Exception { + String resultJsonStr = DESUtil.decrypt(redirect_uri, JXSR_SSO_API_KEY); + JSONObject jsonObject = JSONObject.parseObject(resultJsonStr); + String appKey = jsonObject.getString("appKey"); + SsoApplication queryObject = new SsoApplication(); + queryObject.setAppKey(appKey); + List ssoApplications = iSsoApplicationService.querySsoApplicationByAppKeyAndSecret(queryObject); + if (!CollectionUtils.isEmpty(ssoApplications)) { + SsoApplication ssoApplication = ssoApplications.get(0); + return "redirect:" + ssoApplication.getAppCallBackUrl() + "?ticket=" + ticket + "&loginType=" + logintype; + } + throw new BusinessException("应用不存在!"); + } + + @ApiOperation("根据ticket获取用户信息") + @GetMapping(value = "/validateTicket", produces = "application/json;charset=utf-8") + @ResponseBody + public String validateTicket(@ApiParam(value = "回调中获取的ticket值", type = "String", required = true) String ticket) { + HttpResponse response = HttpRequest.post("https://login.jxzwfww.gov.cn/auth2/validationTicket.do") + .form("ticket", ticket) + .form("clientId", JXSR_CLIENT_ID) + .send(); + return response.bodyText(); + } +} \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sso/SsoApplicationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sso/SsoApplicationController.java new file mode 100644 index 000000000..108a09dbd --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/sso/SsoApplicationController.java @@ -0,0 +1,137 @@ +package com.ruoyi.web.controller.sso; + +import java.util.Date; +import java.util.List; +import java.util.UUID; + +import com.ruoyi.framework.util.ShiroUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; +import org.springframework.util.Base64Utils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.sso.domain.SsoApplication; +import com.ruoyi.sso.service.ISsoApplicationService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 单点登录应用Controller + * + * @author shixueshu + * @date 2020-03-23 + */ +@Controller +@RequestMapping("/sso/ssoApplication") +public class SsoApplicationController extends BaseController +{ + private String prefix = "sso/ssoApplication"; + + @Autowired + private ISsoApplicationService ssoApplicationService; + + @RequiresPermissions("sso:ssoApplication:view") + @GetMapping() + public String ssoApplication() + { + return prefix + "/ssoApplication"; + } + + /** + * 查询单点登录应用列表 + */ + @RequiresPermissions("sso:ssoApplication:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(SsoApplication ssoApplication) + { + startPage(); + List list = ssoApplicationService.selectSsoApplicationList(ssoApplication); + return getDataTable(list); + } + + /** + * 导出单点登录应用列表 + */ + @RequiresPermissions("sso:ssoApplication:export") + @Log(title = "单点登录应用", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(SsoApplication ssoApplication) + { + List list = ssoApplicationService.selectSsoApplicationList(ssoApplication); + ExcelUtil util = new ExcelUtil(SsoApplication.class); + return util.exportExcel(list, "templates/sso/ssoApplication"); + } + + /** + * 新增单点登录应用 + */ + @GetMapping("/add") + public String add(Model model) + { + String appSecret = Base64Utils.encodeToString(UUID.randomUUID().toString().getBytes()); + model.addAttribute("appSecret", appSecret); + return prefix + "/add"; + } + + /** + * 新增保存单点登录应用 + */ + @RequiresPermissions("sso:ssoApplication:add") + @Log(title = "单点登录应用", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(SsoApplication ssoApplication) + { + ssoApplication.setCreateBy(ShiroUtils.getLoginName()); + ssoApplication.setStatus("1"); + return toAjax(ssoApplicationService.insertSsoApplication(ssoApplication)); + } + + /** + * 修改单点登录应用 + */ + @GetMapping("/edit/{appId}") + public String edit(@PathVariable("appId") Long appId, ModelMap mmap) + { + SsoApplication ssoApplication = ssoApplicationService.selectSsoApplicationById(appId); + mmap.put("ssoApplication", ssoApplication); + return prefix + "/edit"; + } + + /** + * 修改保存单点登录应用 + */ + @RequiresPermissions("sso:ssoApplication:edit") + @Log(title = "单点登录应用", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(SsoApplication ssoApplication) + { + ssoApplication.setUpdateBy(ShiroUtils.getLoginName()); + return toAjax(ssoApplicationService.updateSsoApplication(ssoApplication)); + } + + /** + * 删除单点登录应用 + */ + @RequiresPermissions("sso:ssoApplication:remove") + @Log(title = "单点登录应用", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(ssoApplicationService.deleteSsoApplicationByIds(ids)); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java deleted file mode 100644 index bddbe7789..000000000 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.ruoyi.web.controller.tool; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import com.ruoyi.common.core.controller.BaseController; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.StringUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiOperation; - -/** - * swagger 用户测试方法 - * - * @author ruoyi - */ -@Api("用户信息管理") -@RestController -@RequestMapping("/test/user") -public class TestController extends BaseController -{ - private final static Map users = new LinkedHashMap(); - { - users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); - users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); - } - - @ApiOperation("获取用户列表") - @GetMapping("/list") - public AjaxResult userList() - { - List userList = new ArrayList(users.values()); - return AjaxResult.success(userList); - } - - @ApiOperation("获取用户详细") - @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path") - @GetMapping("/{userId}") - public AjaxResult getUser(@PathVariable Integer userId) - { - if (!users.isEmpty() && users.containsKey(userId)) - { - return AjaxResult.success(users.get(userId)); - } - else - { - return error("用户不存在"); - } - } - - @ApiOperation("新增用户") - @ApiImplicitParam(name = "userEntity", value = "新增用户信息", dataType = "UserEntity") - @PostMapping("/save") - public AjaxResult save(UserEntity user) - { - if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) - { - return error("用户ID不能为空"); - } - return AjaxResult.success(users.put(user.getUserId(), user)); - } - - @ApiOperation("更新用户") - @ApiImplicitParam(name = "userEntity", value = "新增用户信息", dataType = "UserEntity") - @PutMapping("/update") - public AjaxResult update(UserEntity user) - { - if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) - { - return error("用户ID不能为空"); - } - if (users.isEmpty() || !users.containsKey(user.getUserId())) - { - return error("用户不存在"); - } - users.remove(user.getUserId()); - return AjaxResult.success(users.put(user.getUserId(), user)); - } - - @ApiOperation("删除用户信息") - @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path") - @DeleteMapping("/{userId}") - public AjaxResult delete(@PathVariable Integer userId) - { - if (!users.isEmpty() && users.containsKey(userId)) - { - users.remove(userId); - return success(); - } - else - { - return error("用户不存在"); - } - } -} - -@ApiModel("用户实体") -class UserEntity -{ - @ApiModelProperty("用户ID") - private Integer userId; - - @ApiModelProperty("用户名称") - private String username; - - @ApiModelProperty("用户密码") - private String password; - - @ApiModelProperty("用户手机") - private String mobile; - - public UserEntity() - { - - } - - public UserEntity(Integer userId, String username, String password, String mobile) - { - this.userId = userId; - this.username = username; - this.password = password; - this.mobile = mobile; - } - - public Integer getUserId() - { - return userId; - } - - public void setUserId(Integer userId) - { - this.userId = userId; - } - - public String getUsername() - { - return username; - } - - public void setUsername(String username) - { - this.username = username; - } - - public String getPassword() - { - return password; - } - - public void setPassword(String password) - { - this.password = password; - } - - public String getMobile() - { - return mobile; - } - - public void setMobile(String mobile) - { - this.mobile = mobile; - } -} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java index 43353914a..5f49a7adf 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java @@ -50,9 +50,9 @@ public class SwaggerConfig // 用ApiInfoBuilder进行定制 return new ApiInfoBuilder() // 设置标题 - .title("标题:若依管理系统_接口文档") + .title("标题:江西省上饶市政务服务网单点登录_接口文档") // 描述 - .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...") + .description("描述:主要为上饶市对接省政务服务网单点登录接口服务") // 作者信息 .contact(new Contact(Global.getName(), null, null)) // 版本 diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index d69c66d27..ebb1d32c9 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -6,9 +6,9 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://localhost:3306/shangrao_sso_manager?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root - password: password + password: shixueshu # 从库数据源 slave: # 从数据源开关/默认关闭 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 1936b7450..803604997 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -1,11 +1,11 @@ # 项目相关配置 ruoyi: # 名称 - name: RuoYi + name: 上饶省政务服务网单点登陆 # 版本 - version: 4.2.0 + version: 1.0.0 # 版权年份 - copyrightYear: 2019 + copyrightYear: 2020 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) @@ -127,4 +127,4 @@ xss: # 排除链接(多个用逗号分隔) excludes: /system/notice/* # 匹配链接 - urlPatterns: /system/*,/monitor/*,/tool/* + urlPatterns: /system/*,/monitor/*,/tool/*,/sso/* diff --git a/ruoyi-admin/src/main/resources/templates/index.html b/ruoyi-admin/src/main/resources/templates/index.html index fb2280a96..9424329ae 100644 --- a/ruoyi-admin/src/main/resources/templates/index.html +++ b/ruoyi-admin/src/main/resources/templates/index.html @@ -46,12 +46,6 @@ - - 主页 - - 了解若依 - - @@ -74,97 +68,6 @@ - - 实例演示 - - 表单 - - 按钮 - 栅格 - 下拉框 - 时间轴 - 基本表单 - 卡片列表 - 功能扩展 - 拖动排序 - 选项卡 & 面板 - 表单校验 - 表单向导 - 文件上传 - 日期和时间 - 富文本编辑器 - 左右互选组件 - 搜索自动补全 - - - 表格 - - 查询条件 - 数据汇总 - 组合表头 - 表格导出 - 翻页记住选择 - 跳转至指定页 - 自定义查询参数 - 初始多表格 - 点击按钮加载表格 - 表格冻结列 - 自定义触发事件 - 表格细节视图 - 表格父子视图 - 表格图片预览 - 动态增删改查 - 表格拖拽操作 - 表格行内编辑 - 表格其他操作 - - - 弹框 - - 模态窗口 - 弹层组件 - 弹层表格 - - - 操作 - - 表格 - 其他 - - - 报表 - - 百度ECharts - peity - sparkline - 图表组合 - - - 图标 - - Font Awesome - Glyphicons - - - - 四层菜单 - - - 三级菜单1 - - - 四级菜单1 - - - 四级菜单2 - - - - 三级菜单2 - - - - @@ -180,8 +83,6 @@ - 视频教程 - 开发文档 全屏显示 @@ -197,10 +98,6 @@ 修改密码 - - - 切换主题 - diff --git a/ruoyi-admin/src/main/resources/templates/main.html b/ruoyi-admin/src/main/resources/templates/main.html index 48b834082..8a791272d 100644 --- a/ruoyi-admin/src/main/resources/templates/main.html +++ b/ruoyi-admin/src/main/resources/templates/main.html @@ -16,911 +16,11 @@ - 领取阿里云通用云产品1888优惠券 - https://www.aliyun.com/minisite/goods?userCode=brki8iof - 领取腾讯云通用云产品2860优惠券 - https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console - 云产品通用红包,可叠加官网常规优惠使用。(仅限新用户) + 上饶市省政务服务网单点登陆管理平台 - - Hello,Guest - 移动设备访问请扫描以下二维码: - - - - - - - 若依后台管理框架 - 一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。 - - 当前版本:v[[${version}]] - - - ¥免费开源 - - - - - 访问码云 - - - 访问主页 - - - - - 技术选型: - - 核心框架:Spring Boot。 - 安全框架:Apache Shiro。 - 模板引擎:Thymeleaf。 - 持久层框架:MyBatis。 - 定时任务:Quartz。 - 数据库连接池:Druid。 - 工具类:Fastjson。 - 更多…… - - - - - - - - - - - 联系信息 - - - - 官网:http://www.ruoyi.vip - - QQ群:满1389287 满1679294 满1529866 满1772718 满1366522 满1382251 满1145125 满86752435 满134072510 满210336300 339522636 - - 微信:/ *若依 - - 支付宝:/ *若依 - - - - - - - - 更新日志 - - - - - - - - v4.2.02020.03.23 - - - - - - 用户管理添加分配角色页面 - 定时任务添加调度日志按钮 - 新增是否开启用户注册功能 - 新增页面滚动显示返回顶部按钮 - 用户&角色&任务添加更多操作按钮 - iframe框架页会话过期弹出超时提示 - 移动端登录不显示左侧菜单 - 侧边栏添加一套深蓝色主题 - 首页logo固定,不随菜单滚动 - 支持mode配置history(表示去掉地址栏的#) - 任务分组字典翻译(调度日志详细) - 字典管理添加缓存读取 - 字典数据列表标签显示样式 - 参数管理支持缓存操作 - 日期控件清空结束时间设置开始默认值为2099-12-31 - 表格树添加获取数据后响应回调处理 - 批量替换表前缀调整 - 支持表格导入模板的弹窗表单加入其它输入控件 - 表单重置刷新表格树 - 新增支持导出数据字段排序 - 新增表格参数(是否单选checkbox) - druid未授权不允许访问 - 表格树父节点兼容0,'0','',null - 表单必填的项添加星号 - 修复select2不显示校验错误信息 - 添加自定义HTML过滤器 - 修复多数据源下开关关闭出现异常问题 - 修复翻页记住选择项数据问题 - 用户邮箱长度限制20 - 修改错误页面返回主页出现嵌套问题 - 表格浮动提示单双引号转义 - 支持配置四级菜单 - 升级shiro到最新版1.4.2 阻止rememberMe漏洞攻击 - 升级summernote到最新版本v0.8.12 - 导入Excel根据dateFormat属性格式处理 - 修复War部署无法正常shutdown,ehcache内存泄漏 - 修复代码生成短字段无法识别问题 - 修复serviceImpl模版,修改方法判断日期错误 - 代码生成模板增加导出功能日志记录 - 代码生成唯一编号调整为tableId - 代码生成查询时忽略大小写 - 代码生成支持翻页记住选中 - 代码生成表注释未填写也允许导入 - Global全局配置类修改为注解,防止多环境配置下读取问题 - 修复多表格情况下,firstLoad只对第一个表格生效 - 处理Maven打包出现警告问题 - 默认主题样式,防止网速慢情况下出现空白 - 修复文件上传多级目录识别问题 - 锚链接解码url,防止中文导致页面不能加载问题 - 修复右键Tab页刷新事件重复请求问题 - 角色禁用&菜单隐藏不查询权限 - 其他细节优化 - - - - - - - - v4.1.02019.10.22 - - - - - - 支持多表格实例操作 - 浮动提示方法tooltip支持弹窗 - 代码生成&字典数据支持模糊条件查询 - 增加页签全屏方法 - 增加清除表单验证错误信息方法 - 支持iframe局部刷新页面 - 支持在线切换主题 - 修改图片预览设置的高宽参数颠倒问题 - 操作日志新增解锁账户功能 - 管理员用户&角色不允许操作 - 去掉jsoup包调用自定义转义工具 - 添加时间轴示例 - 修复翻页记住选择时获取指定列值的问题 - 代码生成sql脚本添加导出按钮 - 添加表格父子视图示例 - 添加表格行内编辑示例 - 升级fastjson到最新版1.2.60 阻止漏洞攻击 - 升级echarts到最新版4.2.1 - 操作日志新增返回参数 - 支持mybatis通配符扫描任意多个包 - 权限验证多种情况处理 - 修复树形类型的代码生成的部分必要属性无法显示 - 修复非表格插件情况下重置出现异常 - 修复富文本编辑器有序列表冲突 - 代码生成表前缀配置支持多个 - 修复自动去除表前缀配置无效问题 - 菜单列表按钮数据可见不显示(权限标识控制) - 修复设置会话超时时间无效问题 - 新增本地资源通用下载方法 - 操作日志记录新增请求方式 - 代码生成单选按钮属性重名修复 - 优化select2下拉框宽度不会随浏览器改变 - 修复代码生成树表异常 - 其他细节优化 - - - - - - - - v4.0.02019.08.08 - - - - - - 代码生成支持预览、编辑,保存方案 - 新增防止表单重复提交注解 - 新增后端校验(和前端保持一致) - 新增同一个用户最大会话数控制 - Excel导出子对象支持多个字段 - 定时任务支持静态调用和多参数 - 定时任务增加分组条件查询 - 字典类型增加任务分组数据 - 新增表格是否首次加载数据 - 新增parentTab选项卡可在同一页签打开 - 多数据源支持类注解(允许继承父类的注解) - 部门及以下数据权限(调整为以下及所有子节点) - 新增角色数据权限配(仅本人数据权限) - 修改菜单权限显示问题 - 上传文件修改路径及返回名称 - 添加报表插件及示例 - 添加首页统计模板 - 添加表格拖拽示例 - 添加卡片列表示例 - 添加富文本编辑器示例 - 添加表格动态增删改查示例 - 添加用户页面岗位选择框提示 - 点击菜单操作添加背景高亮显示 - 表格树新增showSearch是否显示检索信息 - 解决表格列设置sortName无效问题 - 表格图片预览支持自定义设置宽高 - 添加表格列浮动提示(单击文本复制) - PC端收起菜单后支持浮动显示 - 详细操作样式调整 - 修改用户更新描述空串不更新问题 - 导入修改为模板渲染 - 修改菜单及部门排序规则 - 角色导出数据范围表达式翻译 - 添加summernote富文本字体大小 - 优化表格底部下边框防重叠&汇总像素问题 - 树表格支持属性多层级访问 - 修复IE浏览器用户管理界面右侧留白问题 - 重置按钮刷新表格 - 重置密码更新用户缓存 - 优化验证码属性参数 - 支持数据监控配置用户名和密码 - 文件上传修改按钮背景及加载动画 - 支持配置一级菜单href跳转 - 侧边栏添加一套浅色主题 - 树表格添加回调函数(校验异常状态) - 用户个人中心适配手机端显示 - Excel支持设置导出类型&更换样式 - 检查属性改变修改为克隆方式(防止热部署强转异常) - 其他细节优化 - - - - - - - - v3.4.02019.06.03 - - - - - - 新增实例演示菜单及demo - 新增页签右键操作 - 菜单管理新增打开方式 - 新增点击某行触发的事件 - 新增双击某行触发的事件 - 新增单击某格触发的事件 - 新增双击某格触发的事件 - 新增是否启用显示细节视图 - 支持上传任意格式文件 - 修复角色权限注解失效问题 - 左侧的菜单栏宽度调整 - 新增响应完成后自定义回调函数 - 支持前端及其他模块直接获取用户信息 - 升级swagger到最新版2.9.2 - 升级jquery.slimscroll到最新版1.3.8 - 升级select2到最新版4.0.7 - 新增角色配置本部门数据权限 - 新增角色配置本部门及以下数据权限 - 优化底部操作防止跳到页面顶端 - 修改冻结列选框无效及样式问题 - 修复部门四层级修改祖级无效问题 - 更换开关切换按钮样式 - 新增select2-bootstrap美化下拉框 - 添加表格内图片预览方法 - 修复权限校验失败跳转页面路径错误 - 国际化资源文件调整 - 通知公告布局调整 - 删除页签操作功能 - 表格树新增查询指定列值 - 更改系统接口扫描方式及完善测试案例 - 表格列浮动提示及字典回显默认去背景 - 修复启用翻页记住前面的选择check没选中问题 - 去除监控页面底部的广告 - 日期控件功问题修复及data功能增强 - 新增角色权限可见性(前端直接调用) - 新增获取当前登录用户方法(前端及子模块调用) - 修复热部署重启导致菜单丢失问题 - 优化业务校验失败普通请求跳转页面 - 操作日志新增状态条件查询 - 操作类型支持多选条件查询 - 通知公告防止滚动触底回弹优化 - 其他细节优化 - - - - - - - - v3.3.02019.04.01 - - - - - - 新增线程池统一管理 - 新增支持左右冻结列 - 新增表格字符超长浮动提示 - 升级datepicker拓展并汉化 - 升级druid到最新版本v1.1.14 - 修复个人头像为图片服务器跨域问题 - 修改上传文件按日期存储 - 新增表格客户端分页选项 - 新增表格的高度参数 - 新增表格销毁方法 - 新增表格下拉按钮切换方法 - 新增表格分页跳转到指定页码 - 新增表格启用点击选中行参数 - 修复表格数据重新加载未触发部分按钮禁用 - 使用jsonview展示操作日志参数 - 新增方法(addTab、editTab) - 修改用户管理界面为Tab打开方式 - 表单验证代码优化 - 修复@Excel注解 prompt 属性使用报错 - 修复combo属性Excel兼容性问题 - 新增@Excel导入导出支持父类字段 - 修复关闭最后选项卡无法激活滚动问题 - 增加日期控件显示类型及回显格式扩展选项 - 修复定时任务执行失败后入库状态为成功状态 - 支持定时任务并发开关控制 - 优化权限校验失败普通请求跳转页面 - 捕获线程池执行任务抛出的异常 - 修复IE浏览器导出功能报错 - 新增角色管理分配用户功能 - 新增表格翻页记住前面的选择 - 调整用户个人中心页面 - 修复界面存在的一些安全问题 - 其他细节优化 - - - - - - - - v3.2.02019.01.18 - - - - - - 部门修改时不允许选择最后节点 - 修复部门菜单排序字段无效 - 修复光驱磁盘导致服务监控异常 - 登录界面去除check插件 - 验证码文本字符间距修正 - 升级SpringBoot到最新版本2.1.1 - 升级MYSQL驱动 - 修正登录必填项位置偏移 - Session会话检查优化 - Excel注解支持多级获取 - 新增序列号生成方法 - 修复WAR部署tomcat退出线程异常 - 全屏操作增加默认确认/关闭 - 修复个人信息可能导致漏洞 - 字典数据根据下拉选择新增类型 - 升级Summernote到最新版本v0.8.11 - 新增用户数据导入 - 首页主题样式更换 - layer扩展主题更换 - 用户管理移动端默认隐藏左侧布局 - 详细信息弹出层显示在顶层 - 表格支持切换状态(用户/角色/定时任务) - Druid数据源支持配置继承 - 修正部分iPhone手机端表格适配问题 - 新增防止重复提交表单方法 - 新增表格数据统计汇总方法 - 支持富文本上传图片文件 - - - - - - - - v3.1.02018.12.03 - - - - - - 新增内网不获取IP地址 - 新增cron表达式有效校验 - 定时任务新增详细信息 - 定时任务默认策略修改(不触发立即执行) - 定时任务显示下一个执行周期 - 支持前端任意日期格式处理 - 上传头像删除多余提交按钮 - 表格增加行间隔色配置项 - 表格增加转义HTML字符串配置项 - 表格增加显示/隐藏指定列 - 代码生成优化 - 操作日志参数格式化显示 - 页签新增新增全屏显示 - 新增一键打包部署 - Excel注解新增多个参数 - 新增提交静默更新表格方法 - 新增服务监控菜单 - - - - - - - - v3.0.02018.10.08 - - - - - - 升级poi到最新版3.17 - 导出修改临时目录绝对路径 - 升级laydate到最新版5.0.9 - 升级SpringBoot到最新版本2.0.5 - 优化开始/结束时间校验限制 - 重置密码参数表中获取默认值 - 修复头像修改显示问题 - 新增数据权限过滤注解 - 新增表格检索折叠按钮 - 新增清空(登录、操作、调度)日志 - 固定按钮位置(提交/关闭) - 部门/菜单支持(展开/折叠) - 部分细节调整优化 - 项目采用分模块 - - - - - - - - v2.4.02018.09.03 - - - - - - 支持部门多级查询 - 修复菜单状态查询无效 - 支持IP地址开关 - 支持XSS开关 - 记录日志异步处理 - 字典回显样式更改为下拉框 - 菜单类型必填校验 - 修复在线用户排序报错 - 增加重置按钮 - 支持注解导入数据 - 支持弹层外区域关闭 - 备注更换为文本区域 - 新增角色逻辑删除 - 新增部门逻辑删除 - 支持部门数据权限 - 管理员默认拥有所有授权 - 字典数据采用分页 - 部分细节调整优化 - - - - - - - - v2.3.02018.08.06 - - - - - - 支持表格不分页开关控制 - 修改字典类型同步修改字典数据 - 代码生成新增修改后缀处理 - 代码生成新增实体toString - 代码生成非字符串去除!='' - 导出数据前加载遮罩层 - 部门删除校验条件修改 - 搜索查询下载优化 - 手机打开弹出层自适应 - 角色岗位禁用显示置灰 - 角色禁用不显示菜单 - 新增导出权限 - 角色权限唯一校验 - 岗位名称编码唯一校验 - TreeTable优化 - 支持多数据源 - 其他细节优化 - - - - - - - - v2.2.02018.07.23 - - - - - - 修复批量生成代码异常问题 - 修复定时器保存失败问题 - 修复热部署转换问题 - 支持查询菜单管理,部门管理 - 大多数功能支持时间查询 - 自定义导出注解自动匹配column - 新增任务执行策略 - 操作详细动态显示类型 - 支持动态回显字典数据 - 后台代码优化调整 - 其他细节优化 - - - - - - - - v2.1.02018.07.10 - - - - - - 新增登陆超时提醒 - 修复定时器热部署转换问题 - 修复登录验证码校验无效问题 - 定时任务新增立即执行一次 - 存在字典数据不允许删除字典 - 字典数据支持按名称查询 - 代码生成增加日志注解&表格优化 - 修复用户逻辑删除后能登录问题 - 表格支持多字段动态排序 - 支持三级菜单显示 - 新增ry.sh启动程序脚本 - 其他细节优化 - - - - - - - - v2.0.02018.07.02 - - - - - - 升级SpringBoot到最新版本2.0.3 - 新增公告管理 - 表单校验示提体验优化 - 前端通用方法封装调整 - 前端去除js文件,合并到html - 操作加载遮罩层 - 支持全屏模式操作 - 支持注解导出数据 - 系统支持多查询&下载 - 系统样式调整 - - - - - - - - v1.1.62018.06.04 - - - - - - 新增用户列表部门列 - 新增登录地点 - 新增swagger - 修复排序数字校验 - 优化头像上传文件类型限定为图片 - 新增XSS过滤 - 新增热部署提高开发效率 - 修复treegrid居中无效 - 角色多条件查询 - - - - - - - - v1.1.52018.05.28 - - - - - - 优化登录失败刷新验证码 - 新增用户登陆地址时间 - 修复ajax超时退出问题 - 新增html调用数据字典(若依首创) - 调整系统部分样式 - 新增用户逻辑删除 - 新增管理员不允许删除修改 - 升级bootstrapTable到最新版本1.12.1 - 升级layer到最新版本3.1.1 - - - - - - - - v1.1.42018.05.20 - - - - - - 新增参数管理 - 修复头像上传bug - 手机邮箱唯一校验 - 支持手机邮箱登录 - 代码生成优化 - 支持模糊查询 - 支持切换主题皮肤 - 修改权限即时生效 - 修复页签Tab关闭问题 - - - - - - - - v1.1.32018.05.14 - - - - - - 新增验证码(数组计算、字符验证) - 新增cookie记住我 - 新增头像上传 - 用户名密码长度限制 - 通用字段提取 - 支持自定义条件查询 - 部门名称必填、时间格式调整 - 其他细节优化 - - - - - - - - v1.1.22018.05.07 - - - - - - 新增个人信息修改 - 菜单存在子菜单不允许删除 - 菜单分配角色不允许删除 - 角色分配人员不允许删除 - 岗位使用后不允许删除 - 保证用户的数据完整性加入事物 - 新增环境使用手册、数据建模 - Thymeleaf升级到3.0 - 支持非ROOT部署 - - - - - - - - v1.1.12018.04.23 - - - - - - 新增表单构建器 - 代码生成优化 - 支持新增主部门 - 支持选择上级部门、上级菜单 - 新增字典管理单条删除 - 优化一些其他细节 - - - - - - - - v1.1.02018.04.20 - - - - - - 支持密码盐 - 支持新增主目录 - 支持批量生成代码 - 支持表格导出(csv、txt、doc、excel) - 自动适应宽高模式窗体 - 重复校验(角色名、菜单名、部门名) - 优化一些其他细节 - - - - - - - - v1.0.92018.04.14 - - - - - - 新增代码生成(生成包括 java、html、js、xml、sql) - 新增按钮权限控制隐藏(若依首创) - - - - - - - - v1.0.82018.04.08 - - - - - - 新增定时任务(新增、修改、删除、查询、启动/暂停) - 新增调度日志(查询、删除) - - - - - - - - v1.0.72018.04.04 - - - - - - 新增岗位管理(新增、修改、删除、查询) - 优化用户管理,菜单管理部分细节 - - - - - - - - v1.0.62018.03.15 - - - - - - 新增字典管理(新增、删除、修改、查询、数据选择) - 新增用户密码重置 - 优化一些其他细节 - - - - - - - - v1.0.52018.03.12 - - - - - - 新增菜单管理(新增、删除、修改、查询、图标选择) - 部门管理优化(添加责任人、联系电话、邮箱、修改者) - - - - - - - - v1.0.42018.03.11 - - - - - - 新增角色管理(新增、删除、修改、查询、菜单选择) - - - - - - - - v1.0.32018.03.08 - - - - - - 新增用户管理(新增、删除、修改、查询、部门选择) - - - - - - - - v1.0.22018.03.04 - - - - - - 新增部门管理 (新增、删除、修改、查询) - - - - - - - - v1.0.12018.03.03 - - - - - - 新增在线用户 (批量强退、单条强退、查询) - 新增登录日志 (批量删除、查询) - 新增操作日志 (批量删除、查询、详细) - 新增数据监控 (监控DB池连接和SQL的执行) - - - - - - - - v1.0.02018.03.01 - - - - - - 若依管理系统正式发布。 - - - - - - - - - - - - - 捐赠 - - - - 请作者喝杯咖啡(点击图片放大) - - - - - - - - - - diff --git a/ruoyi-admin/src/main/resources/templates/sso/ssoApplication/add.html b/ruoyi-admin/src/main/resources/templates/sso/ssoApplication/add.html new file mode 100644 index 000000000..a7a36ee2f --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sso/ssoApplication/add.html @@ -0,0 +1,55 @@ + + + + + + + + + + 应用名称: + + + + + + 应用描述: + + + + + + 应用标识: + + + + + + 应用密钥: + + + + + + 应用回调地址: + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sso/ssoApplication/edit.html b/ruoyi-admin/src/main/resources/templates/sso/ssoApplication/edit.html new file mode 100644 index 000000000..7d645495f --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sso/ssoApplication/edit.html @@ -0,0 +1,56 @@ + + + + + + + + + + + 应用名称: + + + + + + 应用描述: + + [[*{appDesc}]] + + + + 应用标识: + + + + + + 应用密钥: + + + + + + 应用回调地址: + + [[*{appCallBackUrl}]] + + + + + + + + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/sso/ssoApplication/ssoApplication.html b/ruoyi-admin/src/main/resources/templates/sso/ssoApplication/ssoApplication.html new file mode 100644 index 000000000..c9ad5aa63 --- /dev/null +++ b/ruoyi-admin/src/main/resources/templates/sso/ssoApplication/ssoApplication.html @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + 应用名称: + + + + 搜索 + 重置 + + + + + + + + + 添加 + + + 修改 + + + 删除 + + + 导出 + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DES3Utils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DES3Utils.java new file mode 100644 index 000000000..cdada0d6f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DES3Utils.java @@ -0,0 +1,126 @@ +package com.ruoyi.common.utils; + + +import java.net.URLEncoder; +import java.nio.ByteBuffer; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.UUID; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.commons.codec.binary.Base64; +/** + * des3加密 + * @author wudetian + * + */ +public class DES3Utils { + private static byte[] defaultIV = { 0x23, (byte)0xf2, (byte)0xa3, (byte)0xc6, 0x3e, 0x2b, (byte)0xe7, 0x28 }; + //加密算法 + private static final String Algorithm = "DESede"; + // 加解密统一使用的编码方式 + private static final String encoding = "utf-8"; + // 密钥 + public static final String key="key自写"; + + /** + * des加密 + * + * @param + * @param src + * @return + * @throws Exception + */ + public static String desEncrypt(String src) throws Exception { + return URLEncoder.encode(Base64.encodeBase64String(desEncryptBytes(key, src)),"UTF-8"); + } + + public static String desEncryptNOUrl(String src) throws Exception { + return Base64.encodeBase64String(desEncryptBytes(key, src)); + } + + /** + * des加密 + * + * @param key + * @param src + * @param + * @return + */ + private static byte[] desEncryptBytes(String key, String src) throws Exception{ + SecretKey deskey = new SecretKeySpec(Base64.decodeBase64(key), Algorithm); // 加密 + Cipher c1 = Cipher.getInstance(Algorithm +"/CBC/PKCS5Padding"); + IvParameterSpec IVSpec = IvGenerator(defaultIV); + c1.init(Cipher.ENCRYPT_MODE, deskey, IVSpec); + return c1.doFinal(regularCryptStr(src, encoding)); + } + + + /** + * des解密 + * + * @param + * @param src + * @return + * @throws Exception + */ + public static String desDecrypt(String src) throws Exception { + return desDecryptBytes(key, Base64.decodeBase64(src)); + } + + /** + * des解密 + * + * @param + * @param srcBytes + * @return + * @throws + * @throws Exception + */ + private static String desDecryptBytes(String key, byte[] srcBytes) throws Exception { + SecretKey deskey = new SecretKeySpec(Base64.decodeBase64(key), Algorithm); // 解密 + IvParameterSpec IVSpec = IvGenerator(defaultIV); + Cipher c1 = Cipher.getInstance(Algorithm +"/CBC/PKCS5Padding"); + c1.init(Cipher.DECRYPT_MODE, deskey, IVSpec); + return new String(c1.doFinal(srcBytes), encoding).trim(); + } + + + + + /** + * 格式化待加密字符串,使其长度为8的倍数 + * + * @param strIn + * @return + */ + private static byte[] regularCryptStr(String strIn, String charSet) throws Exception { + ByteBuffer buffer = null; + int iLen = 8 - strIn.getBytes(charSet).length % 8; + if (iLen != 8) { + buffer = ByteBuffer.allocate(strIn.getBytes(charSet).length + iLen); + buffer.put(strIn.getBytes(charSet)); + return buffer.array(); + } else { + return strIn.getBytes(charSet); + } + } + + public static String genKey() throws NoSuchAlgorithmException{ + byte[] keyBytes = UUID.randomUUID().toString().getBytes(); + KeyGenerator generator = KeyGenerator.getInstance("DESede"); + generator.init( new SecureRandom( keyBytes ) ); + SecretKey key = generator.generateKey(); + return Base64.encodeBase64String(key.getEncoded()); + } + + private static IvParameterSpec IvGenerator(byte b[]) throws Exception { + IvParameterSpec IV = new IvParameterSpec(b); + return IV; + } +} \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DESUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DESUtil.java new file mode 100644 index 000000000..fda9827c4 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DESUtil.java @@ -0,0 +1,107 @@ +package com.ruoyi.common.utils; + +import java.security.InvalidKeyException; +import java.security.Key; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.spec.InvalidKeySpecException; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.DESKeySpec; + +import org.apache.commons.codec.binary.Base64; + +public class DESUtil { + //算法名称 + public static final String KEY_ALGORITHM = "DES"; + //算法名称/加密模式/填充方式 + //DES共有四种工作模式-->>ECB:电子密码本模式、CBC:加密分组链接模式、CFB:加密反馈模式、OFB:输出反馈模式 + public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding"; + + /** + * + * 生成密钥key对象 + * @param KeyStr 密钥字符串 + * @return 密钥对象 + * @throws InvalidKeyException + * @throws NoSuchAlgorithmException + * @throws InvalidKeySpecException + * @throws Exception + */ + private static SecretKey keyGenerator(String keyStr) throws Exception { + byte input[] = HexString2Bytes(keyStr); + DESKeySpec desKey = new DESKeySpec(input); + //创建一个密匙工厂,然后用它把DESKeySpec转换成 + SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey securekey = keyFactory.generateSecret(desKey); + return securekey; + } + + private static int parse(char c) { + if (c >= 'a') return (c - 'a' + 10) & 0x0f; + if (c >= 'A') return (c - 'A' + 10) & 0x0f; + return (c - '0') & 0x0f; + } + + // 从十六进制字符串到字节数组转换 + public static byte[] HexString2Bytes(String hexstr) { + byte[] b = new byte[hexstr.length() / 2]; + int j = 0; + for (int i = 0; i < b.length; i++) { + char c0 = hexstr.charAt(j++); + char c1 = hexstr.charAt(j++); + b[i] = (byte) ((parse(c0) << 4) | parse(c1)); + } + return b; + } + + /** + * 加密数据 + * @param data 待加密数据 + * @param key 密钥 + * @return 加密后的数据 + */ + public static String encrypt(String data, String key) throws Exception { + Key deskey = keyGenerator(key); + // 实例化Cipher对象,它用于完成实际的加密操作 + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + SecureRandom random = new SecureRandom(); + // 初始化Cipher对象,设置为加密模式 + cipher.init(Cipher.ENCRYPT_MODE, deskey, random); + byte[] results = cipher.doFinal(data.getBytes()); + // 该部分是为了与加解密在线测试网站(http://tripledes.online-domain-tools.com/)的十六进制结果进行核对 + for (int i = 0; i < results.length; i++) { + System.out.print(results[i] + " "); + } + System.out.println(); + // 执行加密操作。加密后的结果通常都会用Base64编码进行传输 + return Base64.encodeBase64String(results); + } + + /** + * 解密数据 + * @param data 待解密数据 + * @param key 密钥 + * @return 解密后的数据 + */ + public static String decrypt(String data, String key) throws Exception { + Key deskey = keyGenerator(key); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + //初始化Cipher对象,设置为解密模式 + cipher.init(Cipher.DECRYPT_MODE, deskey); + // 执行解密操作 + return new String(cipher.doFinal(Base64.decodeBase64(data))); + } + + public static void main(String[] args) throws Exception { + String source = "amigoxie"; + System.out.println("原文: " + source); + String key = "A1B2C3D4E5F60708"; + String encryptData = encrypt(source, key); + System.out.println("加密后: " + encryptData); + String decryptData = decrypt(encryptData, key); + System.out.println("解密后: " + decryptData); + } +} \ No newline at end of file diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index fc5266d4b..84ff62505 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -71,11 +71,18 @@ UserAgentUtils - - - com.ruoyi - ruoyi-system - + + + com.ruoyi + ruoyi-system + + + + + com.ruoyi + ruoyi-sso + 4.2.0 + diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java index 25eef6136..efc783fc0 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java @@ -249,6 +249,7 @@ public class ShiroConfig filterChainDefinitionMap.put("/ajax/**", "anon"); filterChainDefinitionMap.put("/js/**", "anon"); filterChainDefinitionMap.put("/ruoyi/**", "anon"); + filterChainDefinitionMap.put("/api/**", "anon"); filterChainDefinitionMap.put("/captcha/captchaImage**", "anon"); // 退出 logout地址,shiro去清除session filterChainDefinitionMap.put("/logout", "logout"); diff --git a/ruoyi-sso/pom.xml b/ruoyi-sso/pom.xml new file mode 100644 index 000000000..7108598a0 --- /dev/null +++ b/ruoyi-sso/pom.xml @@ -0,0 +1,35 @@ + + + + ruoyi + com.ruoyi + 4.2.0 + + 4.0.0 + + ruoyi-sso + + + sso单点登录管理模块 + + + + + + + mysql + mysql-connector-java + + + + + com.ruoyi + ruoyi-common + + + + + + \ No newline at end of file diff --git a/ruoyi-sso/src/main/java/com/ruoyi/sso/domain/SsoApplication.java b/ruoyi-sso/src/main/java/com/ruoyi/sso/domain/SsoApplication.java new file mode 100644 index 000000000..5cad7f2b6 --- /dev/null +++ b/ruoyi-sso/src/main/java/com/ruoyi/sso/domain/SsoApplication.java @@ -0,0 +1,125 @@ +package com.ruoyi.sso.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 单点登录应用对象 sso_application + * + * @author shixueshu + * @date 2020-03-23 + */ +public class SsoApplication extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 应用id */ + private Long appId; + + /** 应用名称 */ + @Excel(name = "应用名称") + private String appName; + + /** 应用描述 */ + @Excel(name = "应用描述") + private String appDesc; + + /** 应用标识 */ + @Excel(name = "应用标识") + private String appKey; + + /** 应用密钥 */ + @Excel(name = "应用密钥") + private String appSecret; + + /** 应用回调地址 */ + @Excel(name = "应用回调地址") + private String appCallBackUrl; + + /** 是否启用:0禁用,1启用 */ + @Excel(name = "是否启用:0禁用,1启用") + private String status; + + public void setAppId(Long appId) + { + this.appId = appId; + } + + public Long getAppId() + { + return appId; + } + public void setAppName(String appName) + { + this.appName = appName; + } + + public String getAppName() + { + return appName; + } + public void setAppDesc(String appDesc) + { + this.appDesc = appDesc; + } + + public String getAppDesc() + { + return appDesc; + } + public void setAppKey(String appKey) + { + this.appKey = appKey; + } + + public String getAppKey() + { + return appKey; + } + public void setAppSecret(String appSecret) + { + this.appSecret = appSecret; + } + + public String getAppSecret() + { + return appSecret; + } + public void setAppCallBackUrl(String appCallBackUrl) + { + this.appCallBackUrl = appCallBackUrl; + } + + public String getAppCallBackUrl() + { + return appCallBackUrl; + } + public void setStatus(String status) + { + this.status = status; + } + + public String getStatus() + { + return status; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("appId", getAppId()) + .append("appName", getAppName()) + .append("appDesc", getAppDesc()) + .append("appKey", getAppKey()) + .append("appSecret", getAppSecret()) + .append("appCallBackUrl", getAppCallBackUrl()) + .append("createBy", getCreateBy()) + .append("updateBy", getUpdateBy()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .append("status", getStatus()) + .toString(); + } +} diff --git a/ruoyi-sso/src/main/java/com/ruoyi/sso/mapper/SsoApplicationMapper.java b/ruoyi-sso/src/main/java/com/ruoyi/sso/mapper/SsoApplicationMapper.java new file mode 100644 index 000000000..cf90d493f --- /dev/null +++ b/ruoyi-sso/src/main/java/com/ruoyi/sso/mapper/SsoApplicationMapper.java @@ -0,0 +1,70 @@ +package com.ruoyi.sso.mapper; + +import java.util.List; +import com.ruoyi.sso.domain.SsoApplication; +import org.springframework.stereotype.Repository; + +/** + * 单点登录应用Mapper接口 + * + * @author shixueshu + * @date 2020-03-23 + */ +@Repository +public interface SsoApplicationMapper +{ + /** + * 查询单点登录应用 + * + * @param appId 单点登录应用ID + * @return 单点登录应用 + */ + public SsoApplication selectSsoApplicationById(Long appId); + + /** + * 查询单点登录应用列表 + * + * @param ssoApplication 单点登录应用 + * @return 单点登录应用集合 + */ + public List selectSsoApplicationList(SsoApplication ssoApplication); + + /** + * 新增单点登录应用 + * + * @param ssoApplication 单点登录应用 + * @return 结果 + */ + public int insertSsoApplication(SsoApplication ssoApplication); + + /** + * 修改单点登录应用 + * + * @param ssoApplication 单点登录应用 + * @return 结果 + */ + public int updateSsoApplication(SsoApplication ssoApplication); + + /** + * 删除单点登录应用 + * + * @param appId 单点登录应用ID + * @return 结果 + */ + public int deleteSsoApplicationById(Long appId); + + /** + * 批量删除单点登录应用 + * + * @param appIds 需要删除的数据ID + * @return 结果 + */ + public int deleteSsoApplicationByIds(String[] appIds); + + /** + * 根据应用标识与应用密钥查找应用 + * @param ssoApplication + * @return + */ + List querySsoApplicationByAppKeyAndSecret(SsoApplication ssoApplication); +} diff --git a/ruoyi-sso/src/main/java/com/ruoyi/sso/service/ISsoApplicationService.java b/ruoyi-sso/src/main/java/com/ruoyi/sso/service/ISsoApplicationService.java new file mode 100644 index 000000000..4afd69a27 --- /dev/null +++ b/ruoyi-sso/src/main/java/com/ruoyi/sso/service/ISsoApplicationService.java @@ -0,0 +1,69 @@ +package com.ruoyi.sso.service; + +import java.util.List; +import com.ruoyi.sso.domain.SsoApplication; + +/** + * 单点登录应用Service接口 + * + * @author shixueshu + * @date 2020-03-23 + */ +public interface ISsoApplicationService +{ + /** + * 查询单点登录应用 + * + * @param appId 单点登录应用ID + * @return 单点登录应用 + */ + public SsoApplication selectSsoApplicationById(Long appId); + + /** + * 查询单点登录应用列表 + * + * @param ssoApplication 单点登录应用 + * @return 单点登录应用集合 + */ + public List selectSsoApplicationList(SsoApplication ssoApplication); + + /** + * 新增单点登录应用 + * + * @param ssoApplication 单点登录应用 + * @return 结果 + */ + public int insertSsoApplication(SsoApplication ssoApplication); + + /** + * 修改单点登录应用 + * + * @param ssoApplication 单点登录应用 + * @return 结果 + */ + public int updateSsoApplication(SsoApplication ssoApplication); + + /** + * 批量删除单点登录应用 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteSsoApplicationByIds(String ids); + + /** + * 删除单点登录应用信息 + * + * @param appId 单点登录应用ID + * @return 结果 + */ + public int deleteSsoApplicationById(Long appId); + + /** + * 根据应用标识与应用密钥查找应用 + * + * @param ssoApplication + * @return + */ + List querySsoApplicationByAppKeyAndSecret(SsoApplication ssoApplication); +} diff --git a/ruoyi-sso/src/main/java/com/ruoyi/sso/service/impl/SsoApplicationServiceImpl.java b/ruoyi-sso/src/main/java/com/ruoyi/sso/service/impl/SsoApplicationServiceImpl.java new file mode 100644 index 000000000..871436ddf --- /dev/null +++ b/ruoyi-sso/src/main/java/com/ruoyi/sso/service/impl/SsoApplicationServiceImpl.java @@ -0,0 +1,102 @@ +package com.ruoyi.sso.service.impl; + +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.sso.mapper.SsoApplicationMapper; +import com.ruoyi.sso.domain.SsoApplication; +import com.ruoyi.sso.service.ISsoApplicationService; +import com.ruoyi.common.core.text.Convert; + +/** + * 单点登录应用Service业务层处理 + * + * @author shixueshu + * @date 2020-03-23 + */ +@Service +public class SsoApplicationServiceImpl implements ISsoApplicationService +{ + @Autowired + private SsoApplicationMapper ssoApplicationMapper; + + /** + * 查询单点登录应用 + * + * @param appId 单点登录应用ID + * @return 单点登录应用 + */ + @Override + public SsoApplication selectSsoApplicationById(Long appId) + { + return ssoApplicationMapper.selectSsoApplicationById(appId); + } + + /** + * 查询单点登录应用列表 + * + * @param ssoApplication 单点登录应用 + * @return 单点登录应用 + */ + @Override + public List selectSsoApplicationList(SsoApplication ssoApplication) + { + return ssoApplicationMapper.selectSsoApplicationList(ssoApplication); + } + + /** + * 新增单点登录应用 + * + * @param ssoApplication 单点登录应用 + * @return 结果 + */ + @Override + public int insertSsoApplication(SsoApplication ssoApplication) + { + ssoApplication.setCreateTime(DateUtils.getNowDate()); + return ssoApplicationMapper.insertSsoApplication(ssoApplication); + } + + /** + * 修改单点登录应用 + * + * @param ssoApplication 单点登录应用 + * @return 结果 + */ + @Override + public int updateSsoApplication(SsoApplication ssoApplication) + { + ssoApplication.setUpdateTime(DateUtils.getNowDate()); + return ssoApplicationMapper.updateSsoApplication(ssoApplication); + } + + /** + * 删除单点登录应用对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteSsoApplicationByIds(String ids) + { + return ssoApplicationMapper.deleteSsoApplicationByIds(Convert.toStrArray(ids)); + } + + /** + * 删除单点登录应用信息 + * + * @param appId 单点登录应用ID + * @return 结果 + */ + @Override + public int deleteSsoApplicationById(Long appId) + { + return ssoApplicationMapper.deleteSsoApplicationById(appId); + } + + @Override + public List querySsoApplicationByAppKeyAndSecret(SsoApplication ssoApplication) { + return ssoApplicationMapper.querySsoApplicationByAppKeyAndSecret(ssoApplication); + } +} diff --git a/ruoyi-sso/src/main/resources/mapper/sso/SsoApplicationMapper.xml b/ruoyi-sso/src/main/resources/mapper/sso/SsoApplicationMapper.xml new file mode 100644 index 000000000..0ba5e7340 --- /dev/null +++ b/ruoyi-sso/src/main/resources/mapper/sso/SsoApplicationMapper.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + select app_id, app_name, app_desc, app_key, app_secret, app_call_back_url, create_by, update_by, create_time, update_time, status from sso_application + + + + + + and app_name like concat('%', #{appName}, '%') + and app_call_back_url like concat('%', #{appCallBackUrl}, '%') + + + + + + where app_id = #{appId} + + + + + + and app_key = #{appKey} + and app_secret = #{appSecret} + + + + + insert into sso_application + + app_name, + app_desc, + app_key, + app_secret, + app_call_back_url, + create_by, + update_by, + create_time, + update_time, + status, + + + #{appName}, + #{appDesc}, + #{appKey}, + #{appSecret}, + #{appCallBackUrl}, + #{createBy}, + #{updateBy}, + #{createTime}, + #{updateTime}, + #{status}, + + + + + update sso_application + + app_name = #{appName}, + app_desc = #{appDesc}, + app_key = #{appKey}, + app_secret = #{appSecret}, + app_call_back_url = #{appCallBackUrl}, + create_by = #{createBy}, + update_by = #{updateBy}, + create_time = #{createTime}, + update_time = #{updateTime}, + status = #{status}, + + where app_id = #{appId} + + + + delete from sso_application where app_id = #{appId} + + + + delete from sso_application where app_id in + + #{appId} + + + + \ No newline at end of file diff --git a/ruoyi-sso/src/ssoApplicationMenu.sql b/ruoyi-sso/src/ssoApplicationMenu.sql new file mode 100644 index 000000000..c4cca8ded --- /dev/null +++ b/ruoyi-sso/src/ssoApplicationMenu.sql @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('单点登录应用', '3', '1', '/sso/ssoApplication', 'C', '0', 'sso:ssoApplication:view', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '单点登录应用菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('单点登录应用查询', @parentId, '1', '#', 'F', '0', 'sso:ssoApplication:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('单点登录应用新增', @parentId, '2', '#', 'F', '0', 'sso:ssoApplication:add', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('单点登录应用修改', @parentId, '3', '#', 'F', '0', 'sso:ssoApplication:edit', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('单点登录应用删除', @parentId, '4', '#', 'F', '0', 'sso:ssoApplication:remove', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('单点登录应用导出', @parentId, '5', '#', 'F', '0', 'sso:ssoApplication:export', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
- 领取阿里云通用云产品1888优惠券 - https://www.aliyun.com/minisite/goods?userCode=brki8iof - 领取腾讯云通用云产品2860优惠券 - https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console - 云产品通用红包,可叠加官网常规优惠使用。(仅限新用户) + 上饶市省政务服务网单点登陆管理平台
一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。,她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
- 当前版本:v[[${version}]] -
- ¥免费开源 -
- - 访问码云 - - - 访问主页 - -
官网:http://www.ruoyi.vip -
QQ群:满1389287 满1679294 满1529866 满1772718 满1366522 满1382251 满1145125 满86752435 满134072510 满210336300 339522636 -
微信:/ *若依 -
支付宝:/ *若依 -
2020.03.23
2019.10.22
2019.08.08
2019.06.03
2019.04.01
2019.01.18
2018.12.03
2018.10.08
2018.09.03
2018.08.06
2018.07.23
2018.07.10
2018.07.02
2018.06.04
2018.05.28
2018.05.20
2018.05.14
2018.05.07
2018.04.23
2018.04.20
2018.04.14
2018.04.08
2018.04.04
2018.03.15
2018.03.12
2018.03.11
2018.03.08
2018.03.04
2018.03.03
2018.03.01
- - -