当前位置: 首页 > 科技观察

图解设计模式:身份认证场景应用

时间:2023-03-15 17:09:24 科技观察

设计模式今天和大家聊聊如何合理地将多个设计模式放到同一个业务场景中。业务后台最近接到一个认证需求。购买公司保险时,您需要进行实名认证,以确认您的身份。为了保证业务复用,将鉴权逻辑单独拆分成微服务模块。C端用户下单购买保险的逻辑大致如下。先说一些关于认证的基础知识。.简单来说,你如何证明你是你自己?一些云服务商会有验证身份的支付接口。下面以腾讯云的姓名和身份证双因素认证为例。解开用户购买保险的步骤。用户在前端发起鉴权动作请求,通过网关调用保险服务。保险服务调用身份验证服务。鉴权服务调用腾讯云鉴权支付接口,返回鉴权结果信息。身份验证过程。在整个区块认证过程中,我们会依次讲解策略、责任链、模板模式这三种设计模式。策略模式定义了一组算法类,并分别封装了各个算法,使它们可以相互替代。策略模式使这些算法能够在客户端调用它们时相互独立地改变。客户端指的是使用该算法的代码。我们以认证为例,定义一个认证接口,然后实现第二、三、四要素和人脸识别的实现;将这些实现类放入一个Map容器??中,并与业务指定对应的标识Key,通过标识Key获取对应的认证策略。如果真的像上面这么简单,if-else判断加上拆解几个认证函数就可以搞定,strategy模式还真没必要。我们扩展来看一个复杂的场景:假设以后腾讯云的鉴权不满足,为了保证可用性和更多的流量,需要连接更多的鉴权平台可用性:不太可能是平台保证全年100%可用,需要有容灾降级或替换方案。更多流量:腾讯云认证接口限流100次/S。这时候策略模式的优势就体现出来了。是的,简化代码复杂度并保证开闭原则,增加程序的健壮性和可扩展性,后面再添加三方认证平台和认证方式,不改变原有逻辑,只需要添加相应的即可执行。责任链模型在责任链模式下,多个处理器(指拦截器)依次处理同一个请求。一个请求先由A处理器处理,然后传递给B处理器,B处理器处理后再传递给C处理器,以此类推,形成一条链,链上的每个处理器负责自己的处理这里的responsibility主要是应用责任链模型,避免无意义的调用第三方认证服务。持证人员信息在有效期内无需再次调用。如果认证结果有误,仍会扣款。比如名字中包含非中文、身份证格式错误等。我们可以让processor尽量专一,方便后续复用和安排其他的认证方式。模板方法模板方法模式在一个方法中定义了一个算法框架,将一些步骤交给子类来完成。模板方法模式允许子类在不改变算法整体结构的情况下重新定义算法中的一些步骤。模板方法的主要功能:可重用性和可扩展性。可扩展性用于层次调用:在不修改方法逻辑的情况下,改变部分步骤。一般来说:定义一个抽象类AbstractTemplate,定义一个或几个抽象方法abstractMethod。代码大致如下:publicabstractclassAbstractAuthenticationService{voidbefore(Trequest){}voidafter(Trequest){}//抽象方法protectedabstractvoidpracticalExecute(Trequest);publicvoidauthentication(Trequest){//预拦截操作,包括但不限于责任链模式调用before(request);//策略模式实现,调用具体的认证类,比如二元认证或者三元认证practicalExecute(request);//资源清理或记录Authentication完成信息after(request);}腾讯云双因素认证实现类,代码如下:@Slf4j@Component@RequiredArgsConstructor//BaseAuthenticationStrategy是策略模式实现,定义了mark和execute方法。{privatestaticfinalStringSUCCESS="0";//责任链容器privatefinalNameIdCardHandlerChainnameIdCardHandlerChain;@OverridepublicStringmark(){返回认证icationEnum.TENCENT.name();}@Overridepublicvoidexecute(NameIdCardAuthenticationReqDTOrequest){authentication(request);}@Overridepublicvoidbefore(NameIdCardAuthenticationReqDTOrequest){//责任链调用nameIdCardHandlerChain.doFilter(request);}@OpublicvoidpracticalExecute(NameIdCardAuthenticationReqDTOrequest){//腾讯云双因素认证具体行为}}最后提个老生常谈的问题。学习设计模式有什么作用?设计模式主要是处理代码的复杂性,使其满足闭包原则,可以提高代码的可扩展性;在合适的场景合理使用设计模式,可以帮助代码实现高内聚、低耦合等优点,你不能决定别人的代码,但你有足够的时间可以决定。尝试以重构的方式编写每一行代码。由于篇幅问题,我没有大张旗鼓地谈论设计模式本身。我会给大家提供一个学习链接:https://github.com/acmenlt/framework最后希望小伙伴们看完文章有所收获,祝你好运。