【仅供内部供应商使用,不提供对外解答和培训】

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

一、特殊名词介绍

该文档为《跟我一起学代码》系列视频课程第一课的配套专题文档。视频课程主要通过对登录的本质含义理解、登录需求处理的方法论、学习产品登录实现逻辑、实战开发登录案例、登录V4框架源码剖析和使用等步骤实现与开发者一起学习单点登录场景的解决通用方案。

二、常用接口说明

(一)、相关链接‘

视频课程链接:已录制完成、目前正在走内部流程审核,发布后会更新此地址

OAuth2 概念理解:http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

OAuth2 认证分类:http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html

企业微信身份认证地址:https://work.weixin.qq.com/api/doc/90000/90135/91020

企业微信access_token文档地址:https://work.weixin.qq.com/api/doc/90000/90135/91039


(二)、产品登录逻辑中可借鉴的API

PC/原生APP/H5 登录后台的入口点:LoginResource

远程设计登录后台的入口点:RemoteDesignResource

注:入口点一般用于当开发者拿到需求后,如果需求为对产品原本的业务逻辑进行干预,而不知道如何切入时,可以通过找到业务入口点(前端F12看网络请求,拿到对应的pathinfo到后台入口点匹配即可)寻找切入的方法。同样也可以在开发者需要实现某些与产品业务单元的逻辑相似时,通过找到对应的入口点观察产品本身的逻辑后学习参考用。

登录过程中可以借鉴的相关API(学习LoginService的登录逻辑):

1、登录事件的触发(可关联到登录事件插件接口):EventDispatcher.fire(LogInOutEvent.LOGIN, new LogInOutResultInfo(req, res, loginRequestInfoBean.getUsername(), true));

注:EventDispatcher有监听和执行事件两个主要功能。插件中如果有其他事件机制就可以不用再造轮子了,可以直接使用。也可以在插件中监听产品已有的其他事件类型

2、解密密码的API:TransmissionTool.decrypt(boolean encrypted, boolean supportCustomEncrypt, String encryptionInfo);

注:PC登录页登录时,密码默认是加密的。可以通过上面的API进行解密

3、判断一个字符串是否存在SQL注入的风险:WebServiceUtils.containSQLChars(String inputString)

4、获取客户端IP:WebServiceUtils.getIpInfoFromRequest(HttpServletRequest req)

5、根据用户名获取用户信息:UserService.getInstance().getUserByUserName(String username);

注:UserService给插件提供了一系列关于决策平台用户数据的增删改查的各种控制接口,开发者可以在任何需要的插件中使用。

6、根据用户ID获取对应的认证对象:ControllerFactory.getInstance().getAuthenticController(String userID)

注:调用产品自身的用户认证,需要先获取对应用户的认证对象再进行认证,内部包含了对PassportProvider接口的引用

7、判断当前的用户是否已经被锁定,被锁定的用户不能再登录:AuthenticController#dealWithLoginLock(User user, Device device, String lockObject, String lockObjectValue);

注:其中lockObject表示锁定的类型,可以是IP或者用户名; lockObjectValue表示锁定的值,比如当前的IP或者当前的用户名

8、检测用户登录信息的合法性:AuthenticController#doAuthentication(User user, String password, Device device)

注:这里的密码是明文

9、获取决策平台配置的超时信息:FSConfig.getInstance().getLoginConfig().getLoginTimeout()

注:FSConfig中包含了大量的决策平台前端显示配置的各种系统控制信息。如果插件开发过程中需要,可以通过他获取到(就不要动不动就去连finedb了)

10、将fine_auth_token设置到状态服务器缓存:在单点登录需求中,可以把一些跟登录用户相关的信息通过状态服务器进行缓存,这样可以保障这些信息获得跟用户登录相同的生命周期并且能支持集群

DecisionStatusService.loginStatusService().put(String token, LoginClientBean clientBean, new Converter<LoginClientBean>() {
            @Override
            public String[] createAlias(LoginClientBean loginClientBean) {
                return new String[]{loginClientBean.getUsername()};
            }
        }, long tokenTimeout);

11、发送平台消息:MessageService.getInstance().sendMessageByUser(User user, String content, String url, MessageUrlType urlType);

注:在各类需求中均可以在需要通知决策系统某用户时使用这个方法进行推送提醒。

12、基本的登录接口:String token = LoginService.getInstance().login(HttpServletRequest req, HttpServletResponse res, String username)

注:该接口可以直接通过用户名进行登录,但是不是说登录的凭证可以直接选择用户名,这样不具备任何可靠性(具体可以在视频中学习)。


(三)、单点登录的关键实现

1、凭证的选择:三个要素 可识别、不可伪造、不可抵赖。如果选择的凭证不具备这三个能力,那么得到的登录方案一定是无效的,并且会将系统置于严重的安全隐患中。

2、凭证的生成:一般凭证的来源有以下2种

a.用户在凭证输入页面手动输入的凭证(用户有感知)

b.待集成系统签发的对用户透明的凭证(用户无感知)

3、获取登录用的凭证:在单点登录需求中,95%以上的凭证都是直接携带在http请求中的,可能的位置包括 query、header、body中。但是也有一些极少的情况下,凭证会通过socket或者数据库信息同步的形式提供。

4、验证凭证获取用户名:一般验证凭证的方式有以下2种

a.决策系统自校验。即无需其他系统协助,决策系统自身通过某些存储数据和算法即可确认凭证的合法性获取登录用户名(比如比对数据库数据、比如校验MD5/SHA等等的签名)

b.决策系统依赖第三方提供的校验接口进行校验。该场景中第三方系统既是凭证的签发系统,也是凭证的校验系统。典型场景就是(OAuth2和CAS)


三、开源案例

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。

视频课程配套demo

  • No labels