From e93117e53f0f69f4d08175c3bab1f05c95ed483c Mon Sep 17 00:00:00 2001 From: Jack_1994 Date: Mon, 23 Mar 2020 23:49:50 +0800 Subject: [PATCH 1/4] =?UTF-8?q?1=E3=80=81=E5=BA=94=E7=94=A8=E7=AE=A1?= =?UTF-8?q?=E7=90=86=202=E3=80=81=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 3 +- ruoyi-admin/pom.xml | 14 +- .../web/controller/api/SsoApiController.java | 87 ++ .../sso/SsoApplicationController.java | 137 +++ .../web/controller/tool/TestController.java | 175 ---- .../ruoyi/web/core/config/SwaggerConfig.java | 4 +- .../src/main/resources/application-druid.yml | 4 +- .../src/main/resources/application.yml | 8 +- .../src/main/resources/templates/index.html | 103 -- .../src/main/resources/templates/main.html | 902 +----------------- .../templates/sso/ssoApplication/add.html | 55 ++ .../templates/sso/ssoApplication/edit.html | 56 ++ .../sso/ssoApplication/ssoApplication.html | 106 ++ .../com/ruoyi/common/utils/DES3Utils.java | 126 +++ .../java/com/ruoyi/common/utils/DESUtil.java | 107 +++ ruoyi-framework/pom.xml | 17 +- .../ruoyi/framework/config/ShiroConfig.java | 1 + ruoyi-sso/pom.xml | 35 + .../com/ruoyi/sso/domain/SsoApplication.java | 125 +++ .../sso/mapper/SsoApplicationMapper.java | 70 ++ .../sso/service/ISsoApplicationService.java | 69 ++ .../impl/SsoApplicationServiceImpl.java | 102 ++ .../mapper/sso/SsoApplicationMapper.xml | 102 ++ ruoyi-sso/src/ssoApplicationMenu.sql | 22 + 24 files changed, 1236 insertions(+), 1194 deletions(-) create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SsoApiController.java create mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/sso/SsoApplicationController.java delete mode 100644 ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java create mode 100644 ruoyi-admin/src/main/resources/templates/sso/ssoApplication/add.html create mode 100644 ruoyi-admin/src/main/resources/templates/sso/ssoApplication/edit.html create mode 100644 ruoyi-admin/src/main/resources/templates/sso/ssoApplication/ssoApplication.html create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/DES3Utils.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/DESUtil.java create mode 100644 ruoyi-sso/pom.xml create mode 100644 ruoyi-sso/src/main/java/com/ruoyi/sso/domain/SsoApplication.java create mode 100644 ruoyi-sso/src/main/java/com/ruoyi/sso/mapper/SsoApplicationMapper.java create mode 100644 ruoyi-sso/src/main/java/com/ruoyi/sso/service/ISsoApplicationService.java create mode 100644 ruoyi-sso/src/main/java/com/ruoyi/sso/service/impl/SsoApplicationServiceImpl.java create mode 100644 ruoyi-sso/src/main/resources/mapper/sso/SsoApplicationMapper.xml create mode 100644 ruoyi-sso/src/ssoApplicationMenu.sql 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 @@
  • -
  • - 实例演示 - -
  • @@ -180,8 +83,6 @@