移动端集成单点登录-vue cas_移动端单点登录-程序员宅基地

技术标签: java  cas  vue  单点登录  小程序  

一. 需求说明

​ 公司做了个移动端 应用,在此应用中需要集成一个公共产品,集成方式为:链接到此产品中的首页,类似ifram加载第三方应用页面。难点在于此公共产品集成了单点登录,所以移动端用应用要集成公共产品的页面,应首先进行单点登录。 详细说明如下:

​ 移动端是微信小程序通过web-view加载的vue前端项目[称作:项目1],此前端项目需要集成另一个**vue**项目[称作:项目2],类似iframe链接外部网站方式。项目2集成了cas单点登录,项目1集成项目2页面时需要先单点登录。以上需求分解为以下任务:

  1. 微信小程序登录、登出逻辑放到项目1中,将小程序相关配置(appId,secret,code)传递到项目1中

  2. 项目1中加载cas登录页,实现登录逻辑、登出逻辑、路由守卫逻辑、参数缓存,涉及以下页面:

    2.1 登录页,负责跳转到cas登录页
    2.2 首页,发送请求到接口项目1,认证(微信openId与平台账号绑定)、获取token并缓存、获取用户信息、缓存以上信息、跳转到业务首页

  3. 项目1后端项目[称作:接口项目1]配置shiro-cas,实现单点登录后跳转到接口项目1中指定action[称作: 跳转action],跳转action负责:

    3.1 获取相关配置,如加载项目2的页面地址;项目1地址

    3.2 跳转到项目1,并传递参数

  4. cas实现子系统主题,也就是项目1访问cas时,应该显示移动端的登录页,pc端访问cas时保持原有的登录页不变,实现多主题,每个子系统可以显示对应的主题登录页

    经过思考设计关键流程如下:

已登录
未登录
web-view
vue登录页
接口项目
cas
是否登录
回调action
cas登录页
vue首页
业务首页
页面流程

二. 各关键流程实现

1. web-view

此流程就是加载vue登录页,并传递微信小程序相关参数,话不多说,关键方法如下:

toLogin: function(e){
    
    var _this = this;
    var p = '?appid=' + appid + '&d=' + new Date().getTime() + '&secret=' + secret + '&xcxVersion=' + app.globalData.xcxVersion + '&classification=' + app.globalData.classification + '&rootpath=' + rootpath_jk;
    wx.login({
    
      success: res => {
    
        p = p + '&code=' + res.code;
        var vueUrl = rootpath + 'casLogin' + p ;
        console.log(vueUrl)
        _this.setData({
    
          webviewUrl_: vueUrl
        });
      }
    })
  }

2. vue登录页

实现:

  • 读取接口项目地址
  • 重定向到接口项目地址
let loginPath = data.apiLoginPath + '/front/login/toIndexPage.action'
          // 不同域名cookie传参失效,改为通过后台传参
          // this.$cookies.set('appid', this.$route.query.appid)
          // this.$cookies.set('secret', this.$route.query.secret)
          // this.$cookies.set('code', this.$route.query.code)
          // this.$cookies.set('xcxVersion', this.$route.query.xcxVersion)
          // this.$cookies.set('classification', this.$route.query.classification)
          // this.$cookies.set('knowerPath', data.knowerPath)
          var p = '?sys=xsscapi&login-at=true&appid=' + this.$route.query.appid + '&secret=' + this.$route.query.secret + '&xcxVersion=' + this.$route.query.xcxVersion + '&classification=' + this.$route.query.classification + '&code=' + this.$route.query.code
          console.log(loginPath + p)
          document.location.href = loginPath + p

注意这里的坑:

  • 将小程序中传过来的参数存在cookie中storage中,当域名发生变化时,参数会获取不到,所以我又将这些参数传递到了后台,后台跳回到vue项目时,还需要将参数传递回来
  • sys=xsscapi&login-at=true,这两个参数传递,否则单点登录成功后,回调action获取不到参数。这块我们对cas做了改动,引入了子系统的概念,有时间再解剖。如果没有定制,注意就行。

3. 接口项目

前端vue项目的后台接口,此项目和需要集成的项目都是cas的客户端系统。此项目使用shiro做权限管理,使用shiro-cas作为cas[^apereo]

客户端,实现:

  • 当未登录时,过滤器拦截将重定向到cas登录页
  • 配置单点成功后回调地址,applicationContext-shiro.xml配置:略
  • 回调action:读取用户信息,传递参数,重定向到vue项目首页
 public String toIndexPage(HttpServletRequest request) {
    
        String prefix = GlobalContext.getProperty("xsscwirless.url");
        User user = SystemSecurityUtils.getUser();
        System.out.println(user.getLoginName());
        StringBuffer buffer = new StringBuffer();
        buffer.append("?appid=" + request.getParameter("appid"));
        buffer.append("&secret=" + request.getParameter("secret"));
        buffer.append("&xcxVersion=" + request.getParameter("xcxVersion"));
        buffer.append("&classification=" + request.getParameter("classification"));
        buffer.append("&code=" + request.getParameter("code"));
        buffer.append("&loginName=" + user.getLoginName());
        buffer.append("&knowerPath=" + GlobalContext.getProperty("xsscwireless.knower.path"));
        buffer.append("&casPath=" + GlobalContext.getProperty("cas.casServerUrl"));
        String entryPath = prefix + "/#/casIndex" + buffer.toString();
        System.out.println("--------entryPath-------" + entryPath);
        return "redirect:" + entryPath;
    }

4. cas

什么是cas?

  1. 官方首页
  2. 官方架构说明
  3. 协议流程
  4. 松哥介绍
  5. war包安装

本需求中,改造CAS,主要实现:不同的客户端可以有不同的登录页,移动端系统访问cas时跳转移动登录页,不应用其他系统访问cas时跳转的登录页。具体实现利用cas主题机制,步骤如下:

4.1. 增加service

在这里插入图片描述

{
  "@class": "org.apereo.cas.services.RegexRegisteredService",
  "serviceId": "^(https|imaps|http)://.*xsscapi/login$",
  "name": "移动端",
  "id": 999,
  "description": "移动端登录页",
  "evaluationOrder": 1,
  "theme": "mobile",
  "attributeReleasePolicy" : {
    "@class" : "org.apereo.cas.services.ReturnAllAttributeReleasePolicy"
  }
}

这里面注意serviceId的配置,移动端前端访问后端api,在没有进行单点登录的时候,api中cas客户端过滤器拦截跳转到cas,路径类似:http://XXX/xsscapi/login,此时serviceId匹配成功,跳转到mobile主题的登录页。

4.2 增加theme

在这里插入图片描述

这里的js、images、css等静态资源都是在mobile主题登录页中使用的,如下

4.3 增加主题登录页

在这里插入图片描述

同时添加mobile.properties,引用静态资源

mobile.css.style=/themes/mobile/css/style.css
mobile.js.jq=/themes/mobile/js/jquery.min.js

然后在登录中(casLoginView.html)引用:

<link rel="stylesheet" th:href="@{${#themes.code('cas.myself.css.classic')}}"/>
        <link rel="stylesheet" th:href="@{${#themes.code('cas.myself.css.iconfont')}}"/>
        <script th:src="@{${#themes.code('cas.javascript.file')}}"></script>
        <script th:src="@{${#themes.code('cas.javascript.gyss')}}"></script>

当然也可以直接引用:

<link href="../../static/themes/mobile/css/style.css">

注意登录页名称不可更改。

经过以上三步,cas的需求就实现完了。

cas跳转到回调action,此action代码已在接口项目部分中贴出,主要是构造参数,跳转移动端vue首页。

 mounted () {
    // loginName
    var loginName = this.$route.query.loginName
    if (loginName) {
      this.setEnv(loginName)
      // authFlag=0,待认证;authFlag=1,已认证
      if (storage.get('authFlag') !== '1') {
        this.authUser()
      } else {
        this.readUser()
      }
    } else {
      console.log('-----单点登录失败----')
      this.$router.push({ path: 'casLogin' })
    }
  }

注意loginName,存入了缓存中,它是进一步获取用户信息的key。此首页后面的代码是获取用户完整信息,然后跳转到业务首页。此两部分涉及具体业务,不再赘述。还有一个问题,就是vue项目的路由守卫。

5. vue路由守卫

解决的问题:

  • 判断是否进行单点登录,未登录跳转到登录页

逻辑很简单,就是判断缓存中是否有loginName,存在即登录,next(),不存在跳转到登录页。

三. 部署注意事项

这部分有些坑,得从小程序说起,小程序要求业务域名必须是https协议,其通过web-view集成了vue项目,此时要求vue项目使用https地址,vue项目首先访问(redirect)其后端api,代码已在vue登录页贴出,所以要求api项目使用https地址,同理要求cas使用https地址。

https使用配置:注意api的tomcat配置,host节点增加valve

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
                          Documentation at: /docs/config/valve.html -->
        <!--
                     <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
                          Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
       <Valve className="org.apache.catalina.valves.RemoteIpValve"
		remoteIpHeader="X-Forwarded-For"
		protocolHeader="X-Forwarded-Proto"
		protocolHeaderHttpsValue="https"/>

      </Host>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/h13089412013/article/details/112763598

智能推荐

分布式光纤传感器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告_预计2026年中国分布式传感器市场规模有多大-程序员宅基地

文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大

07_08 常用组合逻辑电路结构——为IC设计的延时估计铺垫_基4布斯算法代码-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码

OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版

关于美国计算机奥赛USACO,你想知道的都在这_usaco可以多次提交吗-程序员宅基地

文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗

MySQL存储过程和自定义函数_mysql自定义函数和存储过程-程序员宅基地

文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程

半导体基础知识与PN结_本征半导体电流为0-程序员宅基地

文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0

随便推点

【Unity3d Shader】水面和岩浆效果_unity 岩浆shader-程序员宅基地

文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader

广义线性模型——Logistic回归模型(1)_广义线性回归模型-程序员宅基地

文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型

HTML+CSS大作业 环境网页设计与实现(垃圾分类) web前端开发技术 web课程设计 网页规划与设计_垃圾分类网页设计目标怎么写-程序员宅基地

文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写

C# .Net 发布后,把dll全部放在一个文件夹中,让软件目录更整洁_.net dll 全局目录-程序员宅基地

文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录

BRIEF特征点描述算法_breif description calculation 特征点-程序员宅基地

文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点

房屋租赁管理系统的设计和实现,SpringBoot计算机毕业设计论文_基于spring boot的房屋租赁系统论文-程序员宅基地

文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文