目录

  • 1、业务场景
  • 2、前端改造
    • 2.1、新增login_sso.vue
    • 2.2、index.js注册路由
    • 2.3、permission.js增加白名单过滤
    • 2.4、login.js增加后端登录接口
    • 2.5、user.js增加单点登录方法
  • 3、后端改造
    • 3.1、引入依赖
    • 3.2、新增LoginSsoController单点登录控制器
    • 3.3、增加单点登录后端方法
    • 3.4、增加shiro白名单

1、业务场景

若依的自带的登录功能是成熟的,但是如果要接入上级应用的统一认证(单点登录)的话,还是需要改造一下,改造的主要目的是取消验证码可以自动登录,实现的思想网上有很多都一样,本文讲一下实践(可以测试通过的那种),最终浏览器输入GET请求就可以实现.

2、前端改造

2.1、新增login_sso.vue

/src/view/下新增login_sso.vue文件作为自动登录的前端入口.
如果你参考别的示例,可能第一步就卡住了,因为你的若依版本很有可能在/src/view/目录下不支持驼峰命名.vue文件,所以很有可能导致第二步的时候注册不了组件.

<template><div></div>
</template><script>
import {getInfo} from "@/api/login";export default {name: "LoginSso",data() {return {loginRules: {},loading: false,//验证码开关captchaOnOff: true,//注册开关register: false,//重定向redirect: undefined};},watch: {},created() {//页面初始化时调单点登录方法this.loginSso();},methods: {loginSso(){//获取地址栏中的codeconst code = this.$route.query.code;console.log("code="+code)//调用登录的接口if(code==''||code==undefined||code==null){//请求中不带code,拦截为正常登录}else{this.loading = true;//开启过渡动画const loginInfo = {"code" : code};//执行另一套登录操作//不是本系统的用户,去J平台登陆去this.$store.dispatch("LoginSso", loginInfo).then(() => {this.$message.success("登录成功");this.loading = false;//判断当前角色getInfo().then((res) => {//获取角色名称var rolesName = res.roles[0];//获取所属场馆this.deptInfo = res.dept;sessionStorage.setItem("ssUserName", res.user.nickName);//处理登录this.$router.push({path: this.redirect || "/"}).catch(() => {});});}).catch(err=> {console.log("有异常信息",err);this.loading = false;});}},}
};
</script><style rel="stylesheet/scss" lang="scss"></style>

2.2、index.js注册路由

// 公共路由
export const constantRoutes = [//...{path: '/login',component: () => import('@/views/login'),hidden: true},//注册单点登录页面{path: '/loginSso',component: () => import('@/views/login_sso'),hidden: true},//...

2.3、permission.js增加白名单过滤

//增加单点登录白名单
const whiteList = ['/login', '/auth-redirect', '/bind', '/register','/loginSso']

2.4、login.js增加后端登录接口

后端将提供无验证码的登录接口


//单点登录 无验证码登录
export function loginSso(queryParam) {return request({url: '/loginSso',method: 'post',params: queryParam})
}

2.5、user.js增加单点登录方法

切记注意一下文件顶部的import,有可能引入的组件内的其他方法没有引入会导致方法undefined.

import {login, logout, getInfo, loginSso} from '@/api/login'
import { getToken, setToken, removeToken } from '@/utils/auth'//...actions: {//...//单点登录LoginSso({commit}, userInfo){const code = userInfo.code;const queryParams = {'code' : code};return new Promise((resolve, reject) => {loginSso(queryParams).then(res => {setToken(res.token)commit('SET_TOKEN', res.token)resolve()}).catch(error => {reject(error)})})}//...}

3、后端改造

3.1、引入依赖

<!-- https://mvnrepository.com/artifact/org.jodd/jodd-http -->
<dependency><groupId>org.jodd</groupId><artifactId>jodd-http</artifactId><version>6.3.0</version>
</dependency>

3.2、新增LoginSsoController单点登录控制器

package com.ruoyi.web.controller.system;import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.system.service.ISysUserService;
import jodd.http.HttpRequest;
import jodd.http.HttpResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;/*** 单点登录Controller* @author sgc*/
@Slf4j
@RestController
public class LoginSsoController {@Autowiredprivate ISysUserService userService;@Autowiredprivate SysLoginService loginService;@PostMapping("/loginSso")public AjaxResult loginSso(String token) {//这里进行单点登录上级系统的令牌校验 写自己的逻辑JSONObject ssoObject = this.checkSsoToken(token);//处理结果 {code=xxx,data={xxx},msg=xxx}String code = ssoObject.getString("code");String loginName = null;AjaxResult ajax = null;if (code.equals("0")) {//验证成功需要自动登录JSONObject dataObject = ssoObject.getJSONObject("data");//拿到登录名loginName = dataObject.getString("userName");} else {//验证失败返回失败信息ajax = AjaxResult.error(ssoObject.getString("msg"));return ajax;}//组装checkUserNameUnique方法需要的SysUser对象,检测用户名存在否SysUser loginUser = new SysUser();loginUser.setUserName(loginName);if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(loginUser))) {log.info("单点登录用户[{}]已存在.", loginName);} else {log.info("单点登录用户[{}]不存在, 需要创建.", loginName);//将上级系统带过来的用户创建个新用户存储起来SysUser sysUser = this.createSsoUser(ssoObject);userService.insertUser(sysUser);}//生成本系统的令牌给到前端进行登录ajax = AjaxResult.success();//这里设置单点登录用户默认密码为123456String tokenNew = loginService.loginNoCaptcha(loginName, "123456", null);ajax.put("token", tokenNew);ajax.put("msg", "登录成功");return ajax;}//处理父级系统传过来的令牌进行校验返回登录信息结果JSONObject checkSsoToken(String token) {JSONObject jsonObject = new JSONObject();//测试代码jsonObject.put("code","0");jsonObject.put("msg","验证成功");JSONObject jsonObjectData =new JSONObject();jsonObjectData.put("userName","sso1");jsonObjectData.put("nickName","单点1");jsonObject.put("data",jsonObjectData);//测试环境String baseUrl = "http://xxxxx/xxx/check?code=" + token;//根据实际地址进行修改//...//进行逻辑校验...//...return jsonObject;}//组装单点登录的用户对象 将来存入本系统SysUser createSsoUser(JSONObject ssoObject){JSONObject dataObject = ssoObject.getJSONObject("data");//从父级系统拿到的用户信息String userId = dataObject.getString("userId");String companyId = dataObject.getString("companyId");String companyName = dataObject.getString("companyName");String deptId = dataObject.getString("deptId");String userName = dataObject.getString("userName");String nickName = dataObject.getString("nickName");String email = dataObject.getString("email");String phonenumber = dataObject.getString("phonenumber");String sex = dataObject.getString("sex");String avatar = dataObject.getString("avatar");//组装本系统用户信息SysUser sysUser = new SysUser();sysUser.setUserName(userName);sysUser.setNickName(nickName);sysUser.setPassword(SecurityUtils.encryptPassword("123456"));sysUser.setCreateBy("sso");sysUser.setCreateTime(new Date());sysUser.setDeptId(202L);//所属部门 建议在后管新增一个部门进行初始化Long[] roleIds = {100L};sysUser.setRoleIds(roleIds);//归属角色  建议在后管新增一个角色进行初始化return sysUser;}
}

3.3、增加单点登录后端方法

com.ruoyi.framework.web.service.SysLoginService中增加一个无验证码登录的方法loginNoCaptcha.

/*** 无需验证码登录* 重写login方法将验证码模块去掉* @param username* @param password* @param uuid* @return*/
public String loginNoCaptcha(String username, String password,  String uuid)
{// 用户验证Authentication authentication = null;try{UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);AuthenticationContextHolder.setContext(authenticationToken);// 该方法会去调用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(authenticationToken);}catch (Exception e){if (e instanceof BadCredentialsException){AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));throw new UserPasswordNotMatchException();}else{AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));throw new ServiceException(e.getMessage());}}AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));LoginUser loginUser = (LoginUser) authentication.getPrincipal();recordLoginInfo(loginUser.getUserId());// 生成tokenreturn tokenService.createToken(loginUser);
}

3.4、增加shiro白名单

增加后端对于/loginSso的放行.

//...
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
.antMatchers("/login", "/register", "/captchaImage","/loginSso").permitAll()
//...

若依ruoyi框架实现单点登录或者接入统一认证相关推荐

  1. 单点登录SSO,统一认证oAuth名词解释

    CAS( Central Authentication Service ):耶鲁大学开发的单点登录产品 SSO (Single Sign On):单点登录 oAuth(Open Authorizati ...

  2. trs ids身份服务器系统实现统一身份认证与单点登录平台技术,统一身份认证系统设计与实现...

    摘要: 2015年获得科技部批复,同意建设新疆国家农村信息化示范省建设工程.在工程设计开发过程中需要集成各项目组的大量应用系统,这些应用系统都需要对用户进行独立的身份认证,这样导致用户访问不同的系统, ...

  3. 关于Spring Security框架 关于单点登录sso

    1.Spring Security的作用 Spring Security主要解决了认证和授权相关的问题. 认证(Authenticate):验证用户身份,即登录. 授权(Authorize):允许用户 ...

  4. 国内首部Sharepoint 2010深入开发(工作流+安全性+单点登录+AD开发、认证等)

    简介:本课程是国内首部深入讲解Sharepoint 2010全程开发的课程,讲师为微软中国上海公司高级工程师.课程采用技术结合实例的方式讲解,涉及内容包括Sharepoint2010之Linq.WCF ...

  5. 微服务之间单点登录和用户权限认证的实现

    目录 单系统登录机制 HTTP无状态协议 Cookie会话机制 登录状态 多系统登录难点 单点登录系统 单点登录流程 单点注销流程 部署图 子系统与sso认证中心的功能 准备工作 项目结构 修改网关配 ...

  6. Cas websso单点登录系统接入汇总

    第 1 章 .net 应用程序 .NET应用程序通过修改web.config文件.主要改造内容如下: - 程序集部署 - 添加casClientConfig 配置节 - 修改ASP.NET forms ...

  7. trs ids身份服务器系统实现统一身份认证与单点登录平台技术,统一身份认证和单点登录系统建设方案.pdf...

    福建省公安公众服务平台 统一身份认证及单点登录系统建设方案 福建公安公众服务平台建设是我省公安机关 "三大战役"社会管 理创新的重点项目之一: 目前平台目前已经涵盖了公安厅公安门户 ...

  8. SSO单点登录简析 身份认证 安当加密

    本文介绍SSO概念和简略方案原理,不拆解协议细节. 一.身份认证 身份是一切信任的基础.基于身份的信任思维就是不信任企业内部和外部的任何人.任何系统,需要基于身份认证和授权,执行以身份为中心的访问控制 ...

  9. Django框架(十八)—— auth框架:用户登录、注册、认证

    auth模块 一.什么是author模块 Auth模块是Django自带的用户认证模块,可以实现包括用户注册.用户登录.用户认证.注销.修改密码等功能.默认使用 auth_user 表来存储用户数据. ...

最新文章

  1. 不用工具箱的神经网络matlab程序_MATLAB中的神经网络工具箱(2)函数命令及模型搭建...
  2. 天籁obd接口针脚定义_OBD协议介绍
  3. linux select 多路复用机制
  4. 动态执行c# 脚本片段
  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型
  6. 《星际争霸 / StarCraft 》超经典游戏!
  7. 转载:百度地图api 常用 例子
  8. 需求分析与建模最佳实践_社交媒体和主题建模:如何在实践中分析帖子
  9. Knative 初体验:Serving Hello World
  10. java 下载图片 弹出框_javaweb多图片打包下载,弹出提示框问题_html/css_WEB-ITnose
  11. 【Flink】FlinkPer-partition watermark 问题 某个 分区延迟 导致数据丢失
  12. 阿里取消“361”绩效考核,不写周报不鼓励加班?
  13. 学点PYTHON基础的东东--数据结构,算法,设计模式---观察者模式
  14. 乱七八糟的想,乱七八糟的记。
  15. 揭秘:为何冬天成都游戏玩家整体水平会下滑?
  16. (音视频学习笔记):ffplay命令选项及使用案例
  17. python实现调用百度图像识别api得到图片识别与检测类别和详细信息以及相关准确度
  18. 迷宫生成与路径规划算法-Python3.8-附Github代码
  19. 我爷爷来了都能看懂的数据库主键,候选键,外键,非空和check的几种约束方式及使用方法
  20. android商城首页布局,仿JD商城UI布局达到90%

热门文章

  1. PTA - 数据库合集22
  2. 汇编基础--cmp汇编指令
  3. 作为IT行业过来人,我有一些话不得不说
  4. mysql数据库之字段类型
  5. 【时间序列】ARMA 时序模型形式、理解、统计特性
  6. 二进制、八进制、十进制、十六进制的前缀和后缀
  7. 【译文】四十二种谬误(一)
  8. 【SCI投稿委婉催稿信模板】
  9. htmlparser 获取html,根据htmlparser写的一个提取页面纯文本的C#程序
  10. 全球与中国住院EHR系统市场现状及未来发展趋势(2022)