返回顶部
首页 > 资讯 > 后端开发 > JAVA >若依ruoyi实现单点登录
  • 113
分享到

若依ruoyi实现单点登录

java用户登录 2023-10-02 10:10:55 113人浏览 安东尼
摘要

系统说明(两个系统数据库用户信息username是同步的,都是唯一的) 第三方平台 若依系统(ruoyi分离版) 登录需求: 我登录到第三方平台,第三方平台嵌入我们的若依,所以在跳若依的管理页面时不想再登录了。但是验证是需要把第三方平台的t

系统说明(两个系统数据库用户信息username是同步的,都是唯一的)

  1. 第三方平台 
  2. 若依系统(ruoyi分离版)

登录需求:

我登录到第三方平台,第三方平台嵌入我们的若依,所以在跳若依的管理页面时不想再登录了。但是验证是需要把第三方平台的token解析成username,拿到username只走我们自己只验证账号的认证。(默认是用户名+密码)

实现构想:

通过前端新加一个页面没有任何样式,只接收第三方平台传来的token,拿到token请求我们自定义的登录controller解析到对应的用户名,直接走用户名认证,认证成功返回生成的JwtToken。前端的新页面拿到请求成功的jwtToken后直接延用原来登录的逻辑跳转到若依的首页!

待优化:

拿到第三方平台的token可以再请求下第三方的接口验证对方的token是否有效。如果该账号在若依不存在可以在请求第三方时 获取对方的账号部门信息新建一个。(是防止对方传过来的token被多次使用,因为双方token过期时间不一致)

项目目录结构:(给个大概,截图太累了)

代码实现(全部在若依端进行改造)

  • login.js中添加 (请求后端接口)
export function ywgllogin(data) {  return request({    url: '/ywgllogin',    method: 'post',    data: data  })}
  • user.js中添加(引用组件,添加方法)

 //ywgl通过它自己的accessToken登录      YwglLogin({ commit }, data) {        return new Promise((resolve, reject) => {          ywgllogin(data).then(res => {            setToken(res.token)            commit('SET_TOKEN', res.token)            resolve()          }).catch(error => {            reject(error)          })        })      },
  • index.js中添加
{        path: '/ywgllogin',        component: () =>            import ('@/views/ywgllogin'),        hidden: true    },
  • views下面同原来login.Vue同级新建ywgllogin.vue
  •  permission.js添加白名单放行(两处)

const whiteList = ['/ywgllogin','/login', '/auth-redirect', '/bind', '/reGISter']

if (to.path === '/login'||to.path === '/ywgllogin') {
  • 后端登录新接口(controller)
package com.ruoyi.WEB.controller.system;import com.ruoyi.common.constant.Constants;import com.ruoyi.common.core.domain.ajaxResult;import com.ruoyi.common.core.domain.model.LoginBody;import com.ruoyi.common.utils.StringUtils;import com.ruoyi.framework.web.service.YwglTokenService;import com.ruoyi.system.service.ISysUserService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class YwglAccessTokenLoginController {    @Autowired    private ISysUserService sysUserService;    @Autowired    private YwglTokenService ywglTokenService;        @PostMapping("/ywgllogin")    public AjaxResult ywgllogin(@RequestBody LoginBody loginBody) {        String accessToken = loginBody.getAccessToken();        if (StringUtils.isNotEmpty(accessToken)) {            String tokenNew = ywglTokenService.ywglLogin(accessToken);            AjaxResult ajax = AjaxResult.success();            ajax.put(Constants.TOKEN, tokenNew);            return ajax;                   } else {            return AjaxResult.error();        }            }}
注意:LoginBody新增变量accessToken
  • service添加登录验证走自己的
 public String ywglLogin(String accessToken)    {        // 用户验证        Authentication authentication = null;        String username =accessToken;        try        {            username="这里填自己如何解析我们第三方传来的accessToken变成系统的username这里我就省略了";            authentication = authenticationManager                    .authenticate(new YwglAuthenticationToken(username));        }        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());        // 生成token        return tokenService.createToken(loginUser);    }
  • 添加自定义认证  YwglAuthenticationToken 
package com.ruoyi.framework.ywglsecurity;import org.springframework.security.authentication.AbstractAuthenticationToken;import org.springframework.security.core.GrantedAuthority;import java.util.Collection;public class YwglAuthenticationToken extends AbstractAuthenticationToken {    private final Object principal;    public YwglAuthenticationToken(Object principal) {        super(null);        this.principal = principal;        this.setAuthenticated(false);    }    public YwglAuthenticationToken(Object principal, Collection authorities) {        super(authorities);        this.principal = principal;        super.setAuthenticated(true);    }    @Override    public Object getCredentials() {        return null;    }    @Override    public Object getPrincipal() {        return this.principal;    }    @Override    public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {        if (isAuthenticated) {            throw new IllegalArgumentException(                    "Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");        }        super.setAuthenticated(false);    }    @Override    public void eraseCredentials() {        super.eraseCredentials();    }}
  • 添加 YwglAuthenticationProvider   
package com.ruoyi.framework.ywglsecurity;import com.ruoyi.framework.web.service.UserDetailsServiceImpl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.authentication.AuthenticationProvider;import org.springframework.security.core.Authentication;import org.springframework.security.core.AuthenticationException;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.stereotype.Component;import java.util.Collections;@Componentpublic class YwglAuthenticationProvider   implements AuthenticationProvider {    @Autowired    private UserDetailsServiceImpl userDetailsService;        @Override    public Authentication authenticate(Authentication authentication) throws AuthenticationException {        YwglAuthenticationToken ywglAuthenticationToken = (YwglAuthenticationToken) authentication;        String username = (String) ywglAuthenticationToken.getPrincipal();        UserDetails user = userDetailsService.loadUserByUsername(username);        YwglAuthenticationToken result = new YwglAuthenticationToken(user, Collections.emptyList());                result.setDetails(ywglAuthenticationToken.getDetails());        return result;    }        @Override    public boolean supports(Class aClass) {        return YwglAuthenticationToken.class.isAssignableFrom(aClass);    }}
  • 修改SecurityConfig 放行我们的请求登录路径 并把自定义认证加进来
.antMatchers("/hello","/ywgllogin","/login", "/register", "/captchaImage").anonymous()
@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception{    auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());    auth.authenticationProvider(ywglAuthenticationProvider);}

主要参考:

若依 Spring Security 自定义认证集成_高德新的博客-CSDN博客_若依 认证

若依实现系统单点登录(可绕过验证码)_穆雄雄的博客-CSDN博客

来源地址:https://blog.csdn.net/sinat_28381507/article/details/128131655

--结束END--

本文标题: 若依ruoyi实现单点登录

本文链接: https://lsjlt.com/news/422597.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 若依ruoyi实现单点登录
    系统说明(两个系统数据库用户信息username是同步的,都是唯一的) 第三方平台 若依系统(ruoyi分离版) 登录需求: 我登录到第三方平台,第三方平台嵌入我们的若依,所以在跳若依的管理页面时不想再登录了。但是验证是需要把第三方平台的t...
    99+
    2023-10-02
    java 用户登录
  • 【若依RuoYi短信验证码登录】汇总
    遇到一个场景,需要同时支持手机号或者邮箱和密码或者验证码进行登录的场景,故来记录一下。 说明:此流程主要是基于若依框架集成的多种方式登录,主要演示登录业务逻辑和前端登录密码和验证码切换组件和配置Sec...
    99+
    2023-09-15
    数据库 服务器 java
  • 结合若依框架实现微信小程序授权登录
    文章目录 1 前言1.1 环境准备1.2 登录流程 2.小程序代码2.1 新增按钮微信授权登录2.2 创建wx.Login和wxHandleLogin方法 3.后端代码3.1 yml配置文件中新增微信小程序id和秘钥3.2 ...
    99+
    2023-08-16
    微信小程序 小程序 前端
  • springbootoauth2实现单点登录实例
        我们见过的很多网站,容许使用第三方账号登录,他不需要关注用户信息,只需要用户拿到授权码就可以访问。     oauth2是用...
    99+
    2024-04-02
  • SpringSecurityOAuth2单点登录和登出的实现
    目录1. 单点登录1.1 使用内存保存客户端和用户信息1.2 使用数据库保存客户端和用户信息1.3 单点登录流程1.3 JWT Token2. 单点登出3. 总结参考:Spring ...
    99+
    2024-04-02
  • java单点登录(SSO)的实现
    单点登录(SSO):SSO是指在多个应用系统中个,用户只需要登陆一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一用户的登陆的机制。 SSO的实...
    99+
    2024-04-02
  • NodeJS怎么实现单点登录
    这篇文章主要讲解了“NodeJS怎么实现单点登录”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“NodeJS怎么实现单点登录”吧!什么是单点登录随着公司业务的增多,必然会产生各个不同的系统,如...
    99+
    2023-06-30
  • laravel单点登录怎么实现
    这篇“laravel单点登录怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“laravel单点登录怎么实现”文章吧。单...
    99+
    2023-07-02
  • SpringBoot单点登录怎么实现
    这篇文章主要介绍了SpringBoot单点登录怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot单点登录怎么实现文章都会有所收获,下面我们一起来看看吧。1.具体实现步骤添加拦截器,设置U...
    99+
    2023-07-04
  • CAS实现单点登录实例源码
    修改server.xml文件,如下: 注意: 这里使用的是https的认证方式,需要将这个配置放开,并做如下修改:port="8443" protocol="org.apache.coyote.htt...
    99+
    2023-06-05
  • Redis实现Session共享与单点登录
    首先,导包。 在pom.XML文件里面加入以下: <dependency> <groupId>org.springframework.boot</groupId> <...
    99+
    2022-07-12
    RedisSession共享 RedisSession单点登录
  • 如何使用JWT实现单点登录
    本篇内容介绍了“如何使用JWT实现单点登录”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、故事起源说起 ...
    99+
    2024-04-02
  • vue页面怎么实现单点登录
    在vue页面中实现单点登录的方法有:1.通过Cookie作为凭证媒介实现;2.通过页面重定向方式实现;3.通过JSONP实现;具体方法如下:通过Cookie作为凭证媒介实现单点登录可以在vue中利用cookie作为媒介,用于存放用户凭证,当...
    99+
    2024-04-02
  • NodeJS实现单点登录原理解析
    目录什么是单点登录单点登录原理NodeJS 演示三个不同的服务首次访问跳转至登录页应用A判断登录态,跳转到SSO认证服务器认证服务器判断登录态,渲染登录页校验用户信息,创建令牌从认证...
    99+
    2024-04-02
  • 单点登录原理及实现方式
    一、什么是单点登录 单点登录的英文名叫做:Single Sign On(简称SSO),指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的系统。简而言之,多个系统,统一登陆。 为什么需要做单点登录系统呢?在一些互联网...
    99+
    2023-09-25
    java 分布式
  • nodejs如何实现单点登录系统
    这篇文章主要讲解了“nodejs如何实现单点登录系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs如何实现单点登录系统”吧!单点登录SSO(Single Sign On),就是把...
    99+
    2023-07-05
  • 基于Node如何实现单点登录
    本文小编为大家详细介绍“基于Node如何实现单点登录”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于Node如何实现单点登录”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是单点登录随着公司业务的增多,必然...
    99+
    2023-07-04
  • node如何实现单点登录系统
    今天小编给大家分享一下node如何实现单点登录系统的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一. 基础知识1.1 同源策...
    99+
    2023-07-04
  • Java 单点登录
    Java单点登录(Single Sign-On,简称SSO)是一种身份认证机制,允许用户使用一组凭据(例如用户名和密码)登录一次,然后在多个应用程序中无需重新输入凭据即可访问。 以下是一个基于Java的单点登录实现的示例: 配置认证中心 ...
    99+
    2023-09-12
    java 开发语言 单点登录
  • springboot简单实现单点登录的示例代码
    什么是单点登录就不用再说了,今天通过自定义sessionId来实现它,想了解的可以参考https://www.xuxueli.com/xxl-sso/ 讲一下大概的实现思路吧:这里有...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作