文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

RuoYi开发框架与第三方认证系统集成起来的简单方法

2024-11-30 14:14

关注

背景

若依框架现在很火,很多团队与个人都使用它。作者看了看它最新的代码,它的认证方式有所不同,前后台分离版本使用的是shiro(具体代码:https://gitee.com/y_project/RuoYi/tree/master/ruoyi-framework/src/main/java/com/ruoyi/framework/shiro),微服务版本使用的是JWT(具体代码:https://gitee.com/y_project/RuoYi-Cloud/blob/master/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java#L44)。不过很多时候,我们的组织或公司都已经构建了自己的认证系统,这个时候如何把我们的若依开发的系统和我们的认证系统集成在一起呢。这篇文章就给出全过程保姆式的方法演示。

准备工作

搭建oauth2的认证服务

这个服务我们是基于spring-security-oauth2来实现的。依赖pom.xml如下:



   org.springframework.boot
   spring-boot-starter-security




          org.springframework.security.oauth
          spring-security-oauth2
          ${security.oauth2.version}
 

oauth2认证服务器的配置:

认证服务配置

服务测试

访问/oauth/token使用参数列表如下,注意我们这个地方grant_type用的是password

OAuth 2.0中常见的grant_type:

  1. authorization_code:用于通过授权码获取访问令牌,通常用于Web应用程序或本机应用程序中。
  2. password:用于通过用户名和密码获取访问令牌,通常用于受信任的客户端(如移动应用程序)中。
  3. client_credentials:用于客户端凭据(如应用程序密钥)获取访问令牌,通常用于机器到机器通信中。
  4. refresh_token:用于使用刷新令牌获取新访问令牌,通常用于在访问令牌过期后更新访问令牌。

client_id


client_secret


grant_type

password

scope


username


password


测试授权服务器的接口

正式工作

下面以前后台分离版本的若依为例。

  1. 增加依赖:

   org.springframework.security.oauth.boot
   spring-security-oauth2-autoconfigure
   2.0.1.RELEASE
  1. 去掉shiro相关代码(因为我们是基于spring-security-oauth来实现与认证服务器的对接)。
  2. 在WebsecurityConfig类上添加注解@EnableOAuth2Sso。

改造websecurityconfig

  1. application.yml中添加客户端配置。
security:
  oauth2:
    client:
      clientId: *****
      clientSecret: *****
      accessTokenUri: ${auth-server}/oauth/token
      userAuthorizationUri: ${auth-server}/oauth/authorize
    resource:
      userInfoUri: ${auth-server}/system/user/get
    redirectUri: *****

其中userInfoUri是认证服务器提供的获取用户信息的接口。

  1. 修改ruoyi-ui的login.js中的登录方法,使得它访问认证服务器获取token。
// 登录方法
export function login(username, password, code, uuid) {
  return root_request({
    url: '/oauth/token',
    method: 'post',
    params: { username, password, code, uuid, client_id, client_secret, grant_type, scope }
  })
}

上面的root_request是我们新建的一个axios实例,它访问的是认证服务器,而不是ruoyi的后台。

const service = axios.create({
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: '/cgroot',
  // 超时
  timeout: 10000
})
  1. vue.config.js中添加新的路由。
devServer: {
    host: '0.0.0.0',
    port: port,
    proxy: {
        // detail: https://cli.vuejs.org/config/#devserver-proxy
        [process.env.VUE_APP_BASE_API]: {
            target: `http://localhost:8080`,
            changeOrigin: true,
            pathRewrite: {
             ['^' + process.env.VUE_APP_BASE_API]: ''
            }
        },
      ['/cgroot']: {
        target: `http://localhost:8880`,
        changeOrigin: true,
        pathRewrite: {
          ['^' + '/cgroot']: ''
        }
      }
    },
    disableHostCheck: true
},
  1. 获取用户的方法也要做修改。

public static LoginUser getLoginUser()
{
    try
    {
        OAuth2Authentication authentication = (OAuth2Authentication)getAuthentication();
        Map userMap =
                (Map) ((Map) authentication
                        .getUserAuthentication().getDetails()).get("data");
        SysUser user = new SysUser();
        Integer userId = (Integer) userMap.get("userId");
        Integer proxyId = (Integer) userMap.get("proxyId");
        String userName = (String) userMap.get("userName");
        String avatar = (String) userMap.get("avatar");
        String phonenumber = (String) userMap.get("phonenumber");
        String email = (String) userMap.get("email");
        String nickName = (String)userMap.get("nickName");
        user.setUserId(Long.parseLong(String.valueOf(userId)));
        user.setNickName(nickName);
        user.setAvatar(avatar);
        user.setPhonenumber(phonenumber);
        user.setEmail(email);
        user.setUserName(userName);
        user.setProxyId(Long.parseLong(String.valueOf(proxyId)));
        LoginUser loginUser =  new LoginUser();
        loginUser.setUser(user);
        return loginUser;
    }
    catch (Exception e)
    {
        throw new CustomException("获取用户信息异常", HttpStatus.UNAUTHORIZED);
    }
}

这样便实现了ruoyi开发的系统与我们的第三方认证服务的对接。当然上面实现的是通过grant_type为password方式获取token,如果通过authorization_code获取token的话,上面的login方法里面需要用到重定向回来得到的code。

后记

上面的实现的关键是EnableOAuth2Sso这个注解,EnableOAuth2Sso是一个Spring Security的注解,用于在基于OAuth2的单点登录(SSO)流程中启用OAuth2 SSO支持。它实现在SpringSecurityFilterChain过滤器链上添加OAuth2ClientAuthenticationProcessingFilter这个用于登录认证的Filter。它拦截用户的请求,并通过access_token获取认证服务器上的用户信息,并创建Authentication登录后凭证,并完成principal存储,让人感觉像ruoyi直接访问数据库拿到用户信息一样。

创建Authentication

参考文章

https://www.cnblogs.com/trust-freedom/p/12002089.html(EnableOAuth2Sso原理)。

https://www.rfc-editor.org/rfc/rfc6749 (OAuth2 RFC)。

来源:今日头条内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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