sso模块简单实现阶段简要总结

苏友朋

发布于 2018.04.23 11:30 阅读 2690 评论 0

sso模块简单实现阶段简要总结

sso简要介绍:

      全Single Sign On。是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分

 

sso原理说明:

      sso需要一个独立的注册中心,只有注册中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受注册中心的间接授权。即用户提供安全信息,子应用将安全信息转给注册中心,由注册中心判断登陆成功与否并将登陆结果返回给子应用,子应用进行相应的处理。具体处理见下图

 

sso实现流程图:

sso模块功能实现与使用方法:

    注册中心:SSORegistrationCenter

          主要作用:负担通行账号注册,登录验证,注销验证,提供子应用链接

          使用:启动SSORegistrationCenter项目即可。

 

    子应用:SSOClient

          主要作用:负担过滤客户的登录请求,注销请求,向注册中心发送登录,验证,注销  请求。

          前提:

               1.依赖项目SSOClient

                      <dependency>

                          <groupId>JiangTuo</groupId>

                          <artifactId>SSOClient</artifactId>

                          <version>1.0-SNAPSHOT</version>

                      </dependency>

 

               2.重写文件SSO.properties

                           

 

              3.实现接口:AddUserToSession,示例如下:

@Log4j

@Service

@SuppressWarnings("SpringJavaAutowiringInspection")

public class AddUserToSessionImpl implements AddUserToSession {

    @Resource

    private UserService userService;



    @Override

    public JsonResult AddUserToSessionByAccount(String account, HttpSession session) {

        JsonResult node = new JsonResult();

        UserDto userGet = userService.selectUserByPhone(account);

        if (userGet != null)//可以通过手机号查询到用户

        {

            //获取存入的4为随机数   两次md5加密校验

            String salt = userGet.getSalt();

            if (userGet.getStatus() == UserAuditStatus.WAIT.getStatus()) {

                node.setSuccess(false);

                node.setFailReason("该账户尚未完成验证!");

                return node;

            }

            //设置令牌(根据用户名和当前时间戳)

            String currentTime = Calendar.getInstance().getTimeInMillis() + "";

            String token = StringUtil.md5(userGet.getId() + currentTime);

            //根据用户id更新token

            User userToken = new User();

            userToken.setId(userGet.getId());

            userToken.setToken(token);

            userToken.setLastLoginTime(Calendar.getInstance().getTime());//最后一次登录时间

            userService.updateByPrimaryKeySelective(userToken);

            //带有token的用户信息保存到session

            userGet.setToken(userToken.getToken());

            SessionUtil.setCurrentUser(session, userGet);

            //  logger.info("用户登录httpSession"+session.getId());

            node.setSuccess(true);

            node.setFailReason("登录成功");



        } else {

            //TODO:可以在这里增加用户插入功能,如此就完成了统一注册的功能

            node.setSuccess(false);

            node.setFailReason("该账户尚未注册!");

            //node.put("tip", 4);

        }

        return node;

}

@Override

public JsonResult removeUserToSessionByAccount(HttpSession session) {

    //注销操作

    return null;

  }

}

 

              4.登录的前台代码:

                  可参考SSOClient项目的SSOlogin.jsp和SSOlogin.js

 

              5.注销的前台代码逻辑:

                  (1)首先获取注册中心的所有子应用信息

                           地址:/getAllApp

 

                  (2)获取后进行循环请求:

                           地址:/ASSOLoginOutPost

 

 

统一注册的功能实现是这样的:(注)

 

1首先在子应用中进行注册操作,此操作逻辑由子应用掌控

2操作成功后请求注册中心的注册链接

       地址:/ASSORegister

       参数:account通行证账号   password通行证密码

       只需要在注册中心注册成功即可。

(子应用在登录时,验证(去注册中心的令牌验证)成功后会自动将通行证插入该子应用的数据库,此处需要什么样的参数等可以等客户进入主页后另行插入:代码位置:上文中实现的接口例子代码中最后有一句TODO注释。)

 

 

总结:

       目前该模块实现了统一登录功能、统一注销功能以及统一注册功能。

       但是并非所有代码都集成到了模块中,需要自应用进行相应的编程支持(虽然代码量非常小)。并且数据结构以及功能都相对简单不够完善,尚待实战检验