若依+vue2实现模拟登录

1、背景

第三方通过链接访问若依项目,该链接通过携带唯一标识符:phone(手机号),项目通过手机号查询本项目数据库人员信息实现模拟登录。

2、实现

2.1. 前端实现

2.1.1 创建专用模拟登录页面PhoneLogin.vue

html 复制代码
<template>
  <div class="phone-login-container">
    <div v-if="loading">正在登录中...</div>
    <div v-if="error" class="error-message">{{ error }}</div>
  </div>
</template>

<script>
import { simulateLogin } from '@/api/login'
import { removeToken, setToken } from '@/utils/auth'

export default {
  name: 'PhoneLogin',
  data() {
    return {
      loading: true,
      error: ''
    }
  },
  created() {
    this.handlePhoneLogin()
  },
  methods: {
    async handlePhoneLogin() {
      // 先清除旧账号的所有信息
      await this.$store.dispatch('LogOut')
      removeToken()

      const phone = this.$route.query.phone
      if (!phone) {
        this.error = '请提供手机号参数'
        this.loading = false
        return
      }

      try {
        // 发起模拟登录请求
        const response = await simulateLogin(phone)
        const  token  = response.data.token

        if (!token) {
          throw new Error('未能获取有效token')
        }

        // 存储新token
        setToken(token)

        // 获取新用户信息
        await this.$store.dispatch('GetInfo')

        // 清除可能的路由缓存
        this.$router.app.$options.router.matcher = this.$router.app.$options.router.matcher

        // 跳转到首页
        this.$router.push({ path: '/' })
      } catch (error) {
        console.error('手机号登录失败:', error)
        this.error = '登录失败: ' + (error.message || '未知错误')
        this.loading = false
      }
    }
  }
}
</script>

2.1.2 添加模拟登录API

在 api/login.js 中添加:

html 复制代码
// 模拟登录API
export function simulateLogin(phone) {
  return request({
    url: '/auth/simulate-login?phone'+phone,
    method: 'get'
  });
}

2.1.3 添加白名单

src/permission.js中添加:

html 复制代码
const whiteList = ['/login', '/register',"/phoneLogin"]

2.1.4 添加路由

在router/index.js中添加跳转路由

html 复制代码
{
    path: '/phoneLogin',
    component: () => import('@/views/stationRule/phoneLogin'),
    hidden: true,
    meta: {
      title: '手机号登录',
      noAuth: true // 关键!设置为不需要认证
    }
  },

2.1.5 修改全局权限控制

在 src/permission.js 中确保允许访问该路由:

javascript 复制代码
router.beforeEach(async (to, from, next) => {
  // 获取token
  const hasToken = getToken()
  
  // 如果是phoneLogin路由,直接放行
  if (to.path === '/phoneLogin') {
    next()
    return
  }
  
  // ...原有其他逻辑
}

2.2后端实现

2.2.1在 ruoyi-admin 模块中创建控制器SimulateAuthController

java 复制代码
@RestController
@RequestMapping("/auth")
public class SimulateAuthController extends BaseController {

    @Autowired
    private ISimulateLoginService simulateLoginService;
    @Autowired
    private TokenService tokenService;

    @GetMapping("/simulate-login")
    public AjaxResult simulateLogin(@RequestParam("phone") String phone, HttpServletRequest request) {
        if (StringUtils.isEmpty(phone)) {
            return AjaxResult.error("手机号不能为空");
        }

        // 使旧token失效
        String oldToken = tokenService.getToken(request);
        if (StringUtils.isNotEmpty(oldToken)) {
            tokenService.delLoginUser(oldToken);
        }

        return simulateLoginService.simulateLoginByPhone(phone);
    }
}

2.2.1创建服务接口和实现

java 复制代码
public interface ISimulateLoginService {
    AjaxResult simulateLoginByPhone(String phone);
}

@Service
public class SimulateLoginServiceImpl implements ISimulateLoginService {
    
    @Autowired
    private TokenService tokenService;
    
    @Override
    public AjaxResult simulateLoginByPhone(String phone) {
        // 根据user数据库查询用户,在UserMapper中添加查询方法
        SysUser user = sysUserMapper.selectUserByPhone(phone);
        if (user == null) {
            return AjaxResult.error("用户不存在");
        }
        
        // 创建token
        LoginUser loginUser = new LoginUser();
        loginUser.setUser(user);
        loginUser.setPermissions(permissionService.getMenuPermission(user));
        loginUser.setRoles(roleService.selectRoleKeys(user.getUserId()));
        
        String token = tokenService.createToken(loginUser);
        
        // 返回token和用户信息
        Map<String, Object> result = new HashMap<>();
        result.put("token", token);
        result.put("user", user);
        
        return AjaxResult.success(result);
    }
}

3. 安全配置

3.1 添加白名单

在 SecurityConfig.java 中添加模拟登录接口到白名单:

java 复制代码
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
        // ...其他配置
        .authorizeRequests()
        // 放行模拟登录接口
        .antMatchers("/auth/simulate-login").anonymous()
        // ...其他放行配置
}

4.访问

直接访问 http://localhost:8080?phone=13800138000

成功跳转并可以访问其他链接

相关推荐
古法老登瞎折腾1 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
智能运维指南2 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
yz_aiks3 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵3 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设3 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都3 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
鱼宵3 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作
白山编程大哥3 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Linux运维技术栈4 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
On The Road :4 小时前
Java 多线程详解:从入门到线程安全
java·python·安全