伪单点登录

伪单点登录

记录下昌平网格系统集成我们用若依框架写的统计系统的思路

无非就是在前端从他们页面往我们的页面跳转,大概步骤:

  • 1.用户先通过账号密码登录网格系统,然后返回个token名叫heToken返回给前端,前端在浏览器缓存cookie里保存该token
  • 2.前端访问我们的页面,先判断cookie里面有没有我们系统返回的token名叫weToken,如果有就直接访问我们系统页面(说明不是第一次访问了),没有的话则继续以下步骤
  • 3.前端先从网格系统获取到他们的username,前端会用这个username调用我们后端的免密登录接口。
  • 4.然后我们后台的免密登录的接口(默认放行),里面主要功能就是根据用户的username从数据库获取账户信息,然后生成token(weToken)返回给前端。当然为了安全做了各种加解密操作,在这就赘述了。代码如下:
  • 5.前端将我们那个免密登录的接口获取到的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的代码

    }
posted @ 2024-04-06 10:43  木糖醇困了  阅读(127)  评论(0)    收藏  举报