文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

若依ruoyi实现单点登录

2023-10-02 10:42

关注

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

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

登录需求:

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

实现构想:

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

待优化:

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

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

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

export function ywgllogin(data) {  return request({    url: '/ywgllogin',    method: 'post',    data: data  })}

 //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)          })        })      },
{        path: '/ywgllogin',        component: () =>            import ('@/views/ywgllogin'),        hidden: true    },

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

if (to.path === '/login'||to.path === '/ywgllogin') {
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
 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);    }
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();    }}
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);    }}
.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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯