伪单点登录
记录下昌平网格系统集成我们用若依框架写的统计系统的思路
无非就是在前端从他们页面往我们的页面跳转,大概步骤:
- 1.用户先通过账号密码登录网格系统,然后返回个token名叫heToken返回给前端,前端在浏览器缓存cookie里保存该token
- 2.前端访问我们的页面,先判断cookie里面有没有我们系统返回的token名叫weToken,如果有就直接访问我们系统页面(说明不是第一次访问了),没有的话则继续以下步骤
- 3.前端先从浏览器cookie里面获取到网格系统的token名叫heToken,并从里面获取到username
- 4.然后我们后台会提供一个免密登录的接口(默认放行),里面主要功能就是根据用户的username从数据库获取账户信息,然后生成token(weToken)返回给前端。当人里面为了安全做了各种加解密操作,在这就赘述了。代码如下:
- 5.前端用步骤3中获取到的username去访问步骤4中的后台接口,并返回weToken存到浏览器缓存cookie中,然后就可以正常访问我们系统的页面了。
- 6.往后访问只需重步骤2即可。
- 7.步骤四那个后台接口的核心代码:
SingleSignBody
package com.loit.system.domain;
import com.loit.common.core.domain.BaseEntity;
import lombok.Data;
@Data
public class SingleSignBody extends BaseEntity
{
private static final long serialVersionUID = 1L;
private String code; //这个code其实就是username加密生产的一个暗文
private String channel;
}
SysNoPassLoginController
package com.loit.web.controller.system;
import com.loit.common.constant.Constants;
import com.loit.common.core.domain.AjaxResult;
import com.loit.framework.web.service.SysLoginService;
import com.loit.system.domain.SingleSignBody;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Api(tags = "免密登录验证")
public class SysNoPassLoginController {
@Autowired
private SysLoginService loginService;
/**
* 解析凭证,换取令牌
*
* @param singleSignBody
* @return
*/
@PostMapping("/single-sign-on")
@ApiOperation("免密登录")
public AjaxResult singleSignOn(@RequestBody SingleSignBody singleSignBody) {
AjaxResult ajax = AjaxResult.success();
// 生成令牌
String token = loginService.singleSignOn(singleSignBody);
ajax.put(Constants.TOKEN, token);
return ajax;
}
}
SysLoginService
public String singleSignOn(SingleSignBody singleSignBody) {
/*if (redisCache.getCacheObject(singleSignBody.getCode()) != null) {
throw new ServiceException("登录凭证已失效");
}*/
String userid = null;
try {
userid = Sm2Util.getJieMiContent(singleSignBody.getCode());
} catch (InvalidCipherTextException e) {
throw new RuntimeException(e);
}
LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(userid);
recordLoginInfo(loginUser.getUserId());
AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginUser.getUsername()
, Constants.LOGIN_SUCCESS
, MessageUtils.message("user.login.success")
, LOGIN_BY_SINGLE_SIGN_ON
, singleSignBody.getChannel()));
//redisCache.setLock(singleSignBody.getCode(), "lock", 7 * 24 * 3600L);
return tokenService.createToken(loginUser); //这个方法就是若以框架本来生产token的代码
}
标签:单点,登录,loit,singleSignBody,token,import,com
From: https://www.cnblogs.com/lfh-blog/p/18117214