RuoYi-Vue快速集成Sa-Token 保留原有认证授权逻辑

RuoYi-Vue快速集成Sa-Token 保留原有认证授权逻辑

前言

集成Sa-Token的原因?

  • 由于在项目中,我们有两套账号体系。如电商系统中的 系统用户表 sys_user用户会员表 ums_member, 在这种场景下,如果使用若依原有的认证授权逻辑,会发生逻辑冲突。
  • 修改RuoYi-Vue原有系统的认证授权逻辑,如果对SpringSecurity不熟悉则势必会浪费很多时间与精力,改起来也会比较痛苦。
  • Sa-Token 的 API 设计非常简单,对于APP用户来说,我们一般只需要进行登录认证操作即可。

基础的目的?

  • 保留RuoYi-Vue原有的后台管理认证授权模块。
  • 尽可能的少修改代码。
  • 只做兼容不做修改

实现后的结果?

  • 在修改完成后系统将有两套认证授权逻辑,两套认证环境相互隔离。

    • 系统后台管理原有的认证授权逻辑

    • APP或小程序的认证授权逻辑

具体实现(一共四个步骤)

  • 第一步:添加Sa-Token的依赖

    修改文件: ruoyi-common -> pom.xml

            <!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
            <dependency>
                <groupId>cn.dev33</groupId>
                <artifactId>sa-token-spring-boot-starter</artifactId>
                <version>1.30.0</version>
            </dependency>
    
            <!-- Sa-Token 整合 Redis (使用jackson序列化方式) -->
            <dependency>
                <groupId>cn.dev33</groupId>
                <artifactId>sa-token-dao-redis-jackson</artifactId>
                <version>1.30.0</version>
            </dependency>
    
  • 第二步:修改原有认证授权拦截器配置,让他不拦截APP或小程序发送过来的请求, 通过 /api 前缀判断请求的来源

    修改文件: ruoyi-framework -> src / main / java.com.ruoyi.framework / config / SecurityConfig.java

    // APP请求
    .antMatchers("/api/**").permitAll()
    

    image-20220615170917318

  • 第三步:添加Sa-Token配置,对APP或小程序发送过来的请求进行拦截

    新增文件: ruoyi-framework -> src / main / java.com.ruoyi.framework / config / SaTokenConfig.java

    /**
     * @author zouhuu
     * @description [Sa-Token 权限认证] 配置类
     * @date 2022/06/15 15:32:59
     */
    @Configuration
    public class SaTokenConfig implements WebMvcConfigurer {
    
        // 注册拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // 注册Sa-Token的路由拦截器
            registry.addInterceptor(new SaRouteInterceptor())
                    // 拦截 APP或小程序的 所有请求
                    .addPathPatterns("/api/**")
                    // 排除 APP或小程序的 认证授权请求,如登录等
                    .excludePathPatterns("/api/auth/**");
        }
    }
    
  • 第四步:编写对应的业务代码,实现会员用户的登录,与获取会员用户信息

    新增文件:ruoyi-admin -> src / main /java / com.ruoyi / web / api / AuthApi.java

    /**
     * @author zouhuu
     * @description 授权认证API
     * @date 2022/06/15 15:43:07
     */
    @RestController
    @RequestMapping("/api/auth")
    @Api("APP授权认证API")
    public class AuthApi {
        @PostMapping("/login")
        @ApiOperation("账号密码登录")
        public AjaxResult login(@RequestBody LoginBody loginBody) {
            AjaxResult ajax = AjaxResult.success();
            // TODO 实现具体的业务逻辑
            StpUtil.login("1111");
            ajax.put(StpUtil.getTokenName(), StpUtil.getTokenValue());
            return ajax;
        }
    }
    

    新增文件:ruoyi-admin -> src / main /java / com.ruoyi / web / api / ums / UmsUserApi.java

    /**
     * @author zouhuu
     * @description 用户API
     * @date 2022/06/15 15:53:32
     */
    @RestController
    @RequestMapping("/api/user")
    @Api("用户模块API")
    public class UmsUserApi {
        @GetMapping("/info")
        @ApiOperation("获取用户信息")
        public AjaxResult info() {
            // TODO 实现具体的获取用户信息逻辑
            return AjaxResult.success(StpUtil.isLogin());
        }
    
    }
    

    image-20220615171955242

  • 到此为止,整个集成过程就算完成了,大家如果有问题可以看看官方的文档,,一些配置信息啥的就不介绍了。

参考文章

  • https://sa-token.dev33.cn/doc/
  • https://doc.iocoder.cn/user-center/
### PyCharm 打开文件显示不全的解决方案 当遇到PyCharm打开文件显示不全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure里的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值