深圳商城网站建设公司吉林省建设工程造价信息网
news/
2025/10/2 3:34:51/
文章来源:
深圳商城网站建设公司,吉林省建设工程造价信息网,百度关键词多少钱一个月,个人网站是商业的吗近期有个WEB项目需要改造。业主找第三方搞了一个集成站点#xff0c;将多个应用站点的链接集中放在一个导航页面。由于进入集成站点时已经登录过了#xff0c;业主要求点击这些应用站点的链接时就不必再登录。
以前做过类似项目#xff0c;用的是单点登录。大家都用同一个登…近期有个WEB项目需要改造。业主找第三方搞了一个集成站点将多个应用站点的链接集中放在一个导航页面。由于进入集成站点时已经登录过了业主要求点击这些应用站点的链接时就不必再登录。
以前做过类似项目用的是单点登录。大家都用同一个登录系统一次登录到处同行不亦快哉。不过也有一些缺点一是单点登录比较复杂不好搞。之前我们用过一个开源的单点登录系统cas代码一大堆部署也很复杂然后每个使用它的应用都要有个客户端总之非常复杂。出了问题也不知道是哪里的毛病。最常见的现象就是多次重定向用户登录信息在客户端和服务器之间无限被踢皮球。所以每次想到要用这个东东都心烦意乱甚至吓得面无人色。详见拙作《21世纪应用开源单点登录项目CAS之集大成者》
这还不是最坏的。最大的问题是使用单点登录势必要维护共同的用户信息要么是所有系统都使用同一个用户表要么是大家同步用户信息。不同的应用系统通常由不同的公司开发每个都有自己的设计现在要集成在一起改造工作量可想而知。有些年代久远早就过维护期想改造都不可能。
一、自动登录方案
但这次没有使用单点登录。第三方公司给出了一个方案 1在集成站点的导航页面点击应用站点链接时系统分配一个token 2应用站点可以访问集成站点的接口对token进行验证并获取对应的用户信息。这些用户信息是集成站点的应用系统不一定有 3token验证通过后应用站点就可以自己决定是否让他登录本系统了。
这种思想有点类似auth。auth是第三方验证通过后就自动放行了而这里的方案是接下来还要应用系统自己做一些处理即如何在本系统里放行。
这个方案的好处是不一定要拥有相同的用户信息。如果要求不严格应用系统验证带过来的token后就可以用一个默认的账号自动登录如果非要是同一个账号那么因为验证token的时候会返回用户信息应用系统完全可以之同步到自己的库里。所以这个方案比较灵活应用系统的主动权较大修改工作量比较小难度也较小。人家有高手啊。
二、应用系统的实现
我们系统采用java开发安全框架是Spring Security。我的思路是 1访问本应用系统时检查有无带上第三方token有则执行第2步无则转向本系统的登录页面 2验证第三方token合法则系统自动登录否则转向本系统的登录页面
关键是如何自动登录。
我从前端的登录页面按图索骥发现登录按钮点击后会提交到后端的“/auth/token”。但是我找来找去都找不到对应的代码。后端用的这个框架我不熟悉一问才知/auth/token是Spring Security自己的实现。这个接口访问后会返回一个json对象里面有个关键元素叫“access_token”我们前端就是凭这个来认定是否已经登录了本系统的。
很自然地我要在系统里实现自动登录那我应该创建并返回这个access_token给前端。问题是这个创建过程是黑箱我搞来搞去都生成不了类似的令牌。最后放弃了何必自己去搞系统模拟前端提交访问一下自己这个/auth/token不就好了吗代码如下 GetMapping(value /autoLogin)public String autoLogin(RequestParam(valuetoken3) String token3) {return autoLoginService.autoLogin(token3);}Overridepublic String autoLogin(String token3) {//token3第三方tokenString re null;if(checkToken3(token3)) {re login();} else {re token未经授权;}return re;}private boolean checkToken3(String token) {boolean ok false;//checkUrl验证第三方token网址String url String.format(%s?token%s, checkUrl,token);try {String re HttpUtils.get(url);JSONObject jobj JSONObject.parseObject(re);ok jobj.get(code).toString().equals(200);} catch (Exception ex) {System.err.println(ex.getMessage());}return ok;}private String login() {String re null;//参照前端提交的参数MapString, String params new HashMap();params.put(tenantCode, 10001);params.put(username, account);params.put(password, password);params.put(type, account);params.put(scope, ui);params.put(grant_type, password);params.put(client_id, browser);MapString, String heads new HashMap();heads.put(Authorization, 巴拉巴拉巴拉);heads.put(Content-Type, application/x-www-form-urlencoded);try {//提交给自己的接口登录并返回access_token等。HttpUtils是自己写的静态类re HttpUtils.post(String.format(http://localhost:%s/api/uaa/oauth/token, port), params, heads);} catch (Exception e) {re e.getMessage();}return re;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924529.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!