Webflux中实现双因素认证-如何在Spring (webflux)

教程大全 2025-07-12 00:55:33 浏览

【】目前,在大多情况下,尤其是对于企业级应用、或处理敏感数据的应用(如:财务应用)场景中,多因素身份认证(Multi-factor authentication,MFA)已成为了最常见的处理方法。此外,MFA也被相关法律要求在越来越多的行业中是强制执行(尤其是在欧盟)。因此,如果您正在开发应用程序,那么大概率会以某种形式启用双(或多)因素身份认证。

在本文中,我将向您展示如何为使用Spring Webflux,来构建的响应式API,以实现两因素身份认证。该应用主要使用电子邮件和密码对作为第一安全因素,并采用用户设备上应用程序(如:Google Authenticator)所生成的一次性代码(TOTP)作为第二安全因素。

两因素身份认证是如何工作的

从技术上讲,两(或多)因素身份认证是一个安全过程,用户必须提供两个或更多安全因素来让自己得到认证。也就是说,用户需要提供除密码以外的另一个标识符,例如:一次性密码、硬件令牌、生物特征(如:指纹)等。

该安全过程涉及到如下步骤:

由此可见,与使用短信传递口令代码相比,使用诸如Google Authenticator、Microsoft Authenticator、以及FreeOTP等身份认证应用,既能够避免SIM卡遭受攻击(请参见–

,又能够无需蜂窝网络或互联网连接,进行正常认证。

应用示例

下面,我们将逐步构建一个使用两因素身份认证技术的简单REST API。该API要求用户提供电子邮件密码对,和由应用生成的短代码。在此,我使用Android版的Google Authenticator来生成TOTP。其源代码的github库链接为–

。该应用会用到JDK 11、Maven、以及用于存储用户个人信息的MongoDB。其项目组织结构如下图所示:

应用示例的项目结构

在此,我不会遍历地介绍每一个组成部分,而只会专注于AuthService、TokenManager和TotpManager。这些部分主要负责身份的认证流程。它们分别提供了以下功能:

由于在此仅关注认证组件,因此我们将从用户的创建过程(注册)开始,同时涉及到密钥的生成和令牌的颁发。接着,我们将进入登录流程,涉及一个由用户提供的短代码的断言。

实现注册流程

下面,我们将完成一个注册的过程,其中涉及以下步骤:

我将主要的业务逻辑(AuthServiceImpl)与令牌的生成,以及密钥的产生分离开来。

一般步骤

主要组件AuthServiceImpl会接受SignupRequest,并返回Signupresponse。在后台,它负责整个注册的逻辑。下面是具体的实现代码:

下面,让我们逐步解读上述实现的过程。在逻辑判读中:如果当前用户是新用户,我们将对其进行注册;如果该用户已经存在于数据库之中,那么我们就必须拒绝该请求。具体步骤为:

相比以漏洞和安全问题而闻名的SHA函数,我在此选用jBcrypt库(请参见–,来产生各种安全的哈希和salt(盐)。如不你不太熟悉jBcrypt的话,请参见教程–

,以获取更多信息。

生成密钥

接下来,我们需要实现一个用来生成新的密钥的函数。它是由TotpManager.generateSecret()内部抽象而来。下面是它的代码:

测试

实现了注册逻辑之后,我们需要测试它是否能够按预期进行认证。首先,让我们调用signup端点以创建一个新的用户。其结果对象应当包含我们需要添加到应用生成器(如:Google Authenticator)的userId、令牌和密钥:

成功注册

不过,我们应当禁止同一封电子邮件两次进行注册。在此,我们通过断言,以保证应用在创建新用户之前,去检查现有的电子邮件列表:

登录响应对象

登录

下面,我们来讨论登录流程。该流程包括两个主要部分:认证电子邮件的密码凭据,以及认证由用户提供的一次性代码。和上一节一样,我们首先介绍登录所涉及的步骤:

而JWT的生成过程与注册的过程比较类似。

一般步骤

作为该示例的功能重点,AuthServiceImpl.login将实现主要的业务逻辑。首先,我们需要通过在数据库中请求电子邮件,来查找用户;否则,我们需要提供带有空字段的默认值。也就是说,让user.getUserId() == null,以表示该用户并不存在,登录流程随即中止。

接着,我们需要断言密码的匹配。当我们将密码的哈希值存储在数据库中时,就需要使用存储的salt对请求中的密码进行哈希处理,进而断言这两个值。

如果密码匹配,我们需要使用之前存储的密钥值来认证提交的代码。认证成功与否的结果,将在产生JWT和创建LoginResponse对象后得出。以下便是此部分的最终源代码:

可见,后台的逻辑步骤为:

断言一次性代码

为了认证由应用生成的一次性代码,我们必须向TOTP库提供相应的代码和密钥,并将它们保存为用户实体的一部分。具体代码如下:

测试

最后,我们可以通过测试,以认证登录的过程是否如期运行。我们将由Google Authenticator生成的代码作为登录请求的负载,去调用login端点。

如下图所示,为了检查处密码错误的情况,我们需要将进程终止在密码断言阶段:

由于密码错误,登录被拒绝

至此,我们已经创建了一个简单的REST API,它可以通过Spring Webflux(请参见–

如何在Spring

的TOTP来提供两因素身份认证。如前文所述,为了更专注于身份认证的逻辑,我们省略了所有的其他部分。

如果您对该示例的完整代码感兴趣,请参见–。

参考文献


谁有 永恒之吻 音译歌词?

1、永恒的吻/A kiss as long as eternity (Natalie, Aileen译) 吻,能永恒 我在造通向你的桥 我知道你能听到我 我希望能更接近你。 你在哪里? 世上独身的,分离的人 就像月亮的两半 现实里相遇很难?让我们来实现! 因特网…… 一个吻,我的一个吻飞向你 被十二月的雪带向世界的尽头 一个吻,我的一个吻飞向你 抓住它,保存它 别忘了我和你在一起,我的爱! 吻,能永恒 在秋天和冬天之间 那么偶然 就像临晨三点 接近你 世上独身的,分离的人 我希望知道你的消息和梦想 现实里相遇很难?让我们来实现! 因特网…… 一个吻,我的一个吻飞向你 被十二月的雪带向世界的尽头 一个吻,我的一个吻飞向你 抓住它,保存它 别忘了我和你在一起,我的爱! 1. Поцелуй длинною в вечность Поцелуй длиною в вечность, Строю к тебе мосты, Знаю, ты слышишь, Хочу к тебе ближе, Где ты?! Половины, части света, Так похожи на две части луны, Сложно реально, Давай виртуально, Интернеты! Припев: Поцелуй, поцелуй мой к тебе, Летит на край света снегом декабря. Поцелуй, поцелуй мой к тебе, Летит, лови, храни, Не забывай что я, С тобой любовь моя! Поцелуй длиною в вечность, Между осенью и весной, Так между прочим, В три часа ночи, С тобой! Половины, части света, Твои новости мне б, твои сны, Сложно реально ? - Давай виртуально, Интернеты! Припев: Поцелуй, поцелуй мой к тебе, Летит на край света снегом декабря. Поцелуй, поцелуй мой к тебе, Летит, лови, храни, Не забывай что я, С тобой любовь моя! Проигрыш: Припев: Поцелуй, поцелуй мой к тебе, Летит на край света снегом декабря. Снегом декабря! Поцелуй, поцелуй мой к тебе, Летит, лови, храни, Не забывай что я, С тобой любовь моя! Любовь моя! С тобой любовь моя! Любовь моя! С тобой любовь моя! 1. A Kiss As Long As Eternity (Potseluy dlinoyu v vechnost) A kiss as long as eternity... I am building bridges to you I know you hear me I want to get closer to you. Where are you? The halves, parts of the world Are very much like two parts of the Moon Hard in reality? Lets do it virtually! Internets... A kiss, kiss of mine is flying to you To the worlds end, with December snow A kiss, kiss of mine is flying to you Catch it and save it Dont forget that Im with you, my love! A kiss as long as eternity Between autumn and spring... So incidentally At three oclock in the night It is near you The halves, parts of the world... Id like your news come into your dreams. Hard in reality? Lets do it virtually! Internets... A kiss, kiss of mine is flying to you To the worlds end, with December snow A kiss, kiss of mine is flying to you Catch it and save it Dont forget that Im with you, my love! 注音 ba cai lu i dli no yo f wai shi no st st lo yo k jie bie ma st zi na yo t si lo shi[i:] shi ho shu k jie bie bu li ye p de te da la vi en sha si ti wai ta da k la ha ri[i:] na dwai sha sti lu en s la ri no lie a l no da wai, vi l du a l no in tel ne te ba cai lu i ci lu i mai k jie bie lie tit na k la i sveta si nie gom die ka bu lia ba cai lu i~ba ci lu i mai k jie bie lie tit lavi helani nie za bu wa i shi do ya sda boi liu bo f ma ya ba ci lu i de li no yo f wai shi no st mie ri du a sai na yo i wai s no yi dak mie ri du lia shi mu f tli sha sa na shi s da ba i ba la vi en sha sti s wai ta t wa i na wa sti m nie b t wai si n si la ri no,lie a l no da wai ,vi l du a l no in tel ne te ba cai lu i ci lu i mai k jie bie lie tit na k la i sveta si nie gom die ka bu lia ba cai lu i~ba ci lu i mai k jie bie lie tit lavi helani nie za bu wa i shi do ya sda boi liu bo f ma ya ba cai lu i ci lu i mai k jie bie lie tit na k la i sveta si nie gom die ka bu lia ba cai lu i~ba ci lu i mai k jie bie lie tit lavi helani nie za bu wa i shi do ya sda boi liu bo f ma ya sda boi liu bo f ma ya sda boi liu bo f ma ya

我的同学用手机在网上下载了带病毒的视频,然后QQ文件发给我,我打开手机会中病毒吗?有可能性中病毒吗

别打开,直接删掉,病毒文件之所以会有传播性就是接收文件的人打开了文件

N79好还是N82好

一、 价格浅析一般朋友选择手机之前,总是习惯性的比较一下价格,笔者其实也不例外,毕竟如今经济不景气,金钱方面的花销,总归需要考虑多一些,我们先来比较一下诺基亚N82和N79的价格吧。 目前水货市场里的黑色诺基亚N82售价为2400元左右,而白色或者银色反而价格贵了,一般2500多元,相比之前的售价是跌了不少的,当然目前市场里翻新N82也是存在的,所以各位买家也不要一味只追求便宜,不考虑到品质。 而诺基亚N79目前的零售价格为白色的2600元左右,灰色的2550元左右,价格走势也是属于走下滑路线的,果然如同笔者当初预料的一样,诺基亚N79的走势,应该是会和N78一样,走平民路线,所以价格方面,肯定会下调的,既然要成为街机,价格上肯定要让大伙舒服。 二、外观浅谈 从两款机器的设计风格来看,其实也是传统诺基亚智能手机的设计风格,无论从材质还是做工来说,两款机器都让人觉得比较相似,当然也有所不同。 诺基亚N82,相信大家已经非常的熟悉了,文章中见过多次,采用传统直板的设计,塑料的外壳,黑色比银色酷而且便宜,其实原本一切都很好,但是那键盘做成了米粒型,也许这就是N82最令人纠结的一个设计了吧。 诺基亚N79从颜色搭配和造型上,比N82真的好了太多,也年轻了不少,甚至采用了点儿金属边框,虽然估计用久了会掉漆,但是值得一提得,是键盘方面,回归了正常,也让大家都可以一眼接受了,但是键盘手感上,还是偏生硬了点儿,可能依旧无法满足大众要求的。 所以在外观的选择上,还是可以按照个人喜好来选择的,因为同样都是直板,所以大家只需要多考虑键盘方面即可,哪个看的顺眼,用的顺手,就是适合你自己的机型了。 三、屏幕较量 诺基亚N79作为近期几款诺基亚的新作,个人觉得,其配置应该只能算中档,就拿显示屏来说,其实就还是停留在和N82一样的阶段,使用了一块2.4英寸,TFT材质,分辨率240×320像素,1600万色彩色显示屏。 无论从显示效果,还是从屏幕的材质,两款机器理论上应该是一模一样的,所以之前有很多网友评价说,N82的屏幕感觉比较暗,但是笔者本次将N79同N82放在一起,发觉两款机器也并无多大的区别,可能最多就是N79在亮度方面,会略微好过N82一些,但这并不影响日常使用。 所以就液晶显示屏来看,两款机器打个平手,所以不需要太纠结屏幕,两款机器都不是顶尖,关键是看个人看法和喜好了。 四、键盘手感 笔者一直这么认为,一款手机好不好用,键盘按键的手感,是直接影响到使用者的心情的,所以诺基亚的很多机器,虽然硬件不俗,功能强大,外观新颖,但是说实话键盘设计的确存在弊病,典型范例就是目前当红的N78啦,不得不说,除了纠结,也只有妥协。 诺基亚N82的键盘,前文就已经提高了,米粒型的键盘按钮,接触面积过分的小了,当然和N78的牙签条状按钮比起来,稍微好使一些,但是长时间去使用,势必造成手指疼痛,不过习惯了之后嘛,也还不错,否则网上不会有那么多朋友依旧支持N82的。 而诺基亚N79的键盘,诺基亚终于回归正常,不再用那种细细长长的按钮了,所以很多朋友刚看到N79的图片时,会感觉N79的键盘会比N82好上不少,但是实际使用之后,发觉N79的键盘按钮相当生涩,非常的硬,最下端的“*、#”两个按钮,也因为键盘面积相对比较紧凑和局促,不是特别好按。 所以就这两款机器的键盘方面,笔者自己也持保留态度,当然如果稍微讲究点儿的朋友,还是可以接受N79的键盘会比较容易一些,当然如果觉得自己可以很快适应的话,N82也不会让你觉得纠结。 五、周边设计 既然都是诺基亚直板系列手机,所以我们从手机整体设计上看,会觉得N79和N82是没什么明显大区别的,不过从小细节来看,肯定总是有所区别的。 我们先来比较一下机身的右侧,两款手机的立体声扬声器,都放置在了机身的右侧,从N82开始,很多机器的扬声器都放置在同一边。 N82从上至下分别是音量调节按钮、多媒体资料键、拍照快门按钮,而N79从上至下分别是音量调节按钮、拍照快门按钮,取消了多媒体资料按钮。 再来看看机身左侧吧,比较相似,充电口两款机器都在左侧,都有TF卡槽和Microusb数据线接口,不过仔细观察一下,发觉N79是将TF卡卡槽和数据线接口挤在一起了,比较有新意的构思啊,当然好不好用,大家自己都有自己的看法。 再来看看机身的顶部,N82分别是电源开关、3.5mm耳机插孔、挂绳孔,N79分别是键盘锁按钮、3.5mm耳机插孔、电源开关,比N82多了一个键盘锁的按钮,但是这个按钮相当实用,适合不愿意按组合键锁键盘的朋友。 机身的底部呢,N79有2个洞洞,一个洞是MIC口,另外一个其实是挂绳孔,N82则就一个MIC口,挂绳是移动到了机身顶部的。 我们再来看看机身背面吧,首先两款机器都有镜头保护盖,不必担心镜头玻璃受到磨损或者尘埃的侵蚀了。 不过N79的镜头盖是滑动式的,而N82的镜头盖是拉杆式的,而且闪光灯方面,N82是专业氙气闪光灯,N79是普通双LED闪光灯,这也就是很多人说,N82的夜拍效果强过很多其他诺基亚500万像素手机的原因。 另外在电池后盖方面,N82的电池后盖不是整块的,N79的则是和N78一样,采用整块的电池后盖设计,这样的设计个人觉得不太方便取下电池后盖,而且经常拆卸,很容易把电池后盖上的卡口弄坏,所以大家在拆卸N79后盖的时候,需要仔细点儿。 我们以前的文章也有提过,N79的SIM卡槽新增加了一个推杆,这样一来,就方便很多用户取出SIM卡了,而N82的SIM卡槽,还是采用老式的装置,也同样比较好用的。 电池方面,诺基亚N82采用的是BP-6MT的电池,容量1050毫安时,而N79采用BL-6F的电池,容量是1200毫安时,笔者推测待机时间应该差距不大,因为基本网友反映,可以待机2天至3天左右,所以待机时间不会有什么差距。 六、系统初试 其实从操作系统来看,诺基亚N82采用Symbian OS 9.2 S60第三版FP2平台的操作系统,N79采用Symbian OS 9.3S60第三版FP2平台的操作系统,虽然可以看出N79的系统高级一些,但是从基本操作界面来看,可以说是几乎一样的系统,当然还是有略微的小区别的,比如N79支持用wifi直接在线搜索是否有最新版本,然后直接升级。 就连输入*#0000#,查询软件版本信息,最新平台的N79,都要比N82来的更加详细了。 其余方面,笔者也真的觉得,新平台有的功能,老平台也都大相径庭,无多大区别了,比如MP3播放器、WLAN无线局域网上网功能等等常用功能,两款机器都拥有的。 另外在机身容量上,我们可以看到,最新的N79,反而比N82要少了将近一半的用户可用内存,很多人也许已经开始叹气了吧?别急,比比随机赠送的存储卡吧,N79赠送的是4GB的内存卡,N82赠送的是2GB内存卡,现在再想想哪一个更好啊?呵呵。 因为诺基亚N82和N79都支持N-GAGE游戏功能,所以都内置NG游戏操作平台,从界面上来看,N79的NG平台应该是最新的版本,而且提供了很多试玩版的游戏下载,当然最好是用wifi接入点去下,用GPRS的话速度又慢,又浪费钱,当然最佳玩法,还是破解了系统后再去破解游戏平台。 最后要更正一下,之前很多人以为诺基亚N79没有FM调频发射器,但是那是因为港版的机器把这个功能屏蔽掉了,其实硬件上是支持的,本次我们看到的亚太版N79,就拥有和N78一样的特色工具,FM调频发射器,虽然很多朋友都觉得这个功能可有可无,但是有了总比没强一些。 七、拍照能力 两款机器都采用一枚500万像素卡尔蔡司认证镜头,都支持全屏取景,但是N79使用了双LED的闪光灯,N82使用氙气闪光灯,这也是很多朋友看重N82的优势,但是从实际拍摄的样张我们可以看到,其实N82和N79的照相能力完全一样,而且个人觉得,N79的对焦速度比N82还要快一些。 八、最后总结首先笔者还是想对各位在选择手机时候产生纠结心理的朋友说一句,别太纠结啦!其实N82和N79,都是诺基亚公司设计出来非常不错的智能手机,尽管做工依旧很一般,也都存在这样那样的小缺陷,但是从价格方面考虑,目前N82要比N79更加适合购买,当然大家不要忘记,N79才上市没多久,价格已经下滑成这样了,所以预测它的未来行情和N78一样,不无道理的,所以如果急着出手购买的朋友,只需要按照个人对于外观的喜好来选择即可,如果看好N79的朋友且并不是特别心急的话,再观望一下也是可以的,当然早买早享受,喜欢的话,随时出手,两款机器也都不会让你后悔。 最后希望各位朋友都能够早日买到自己喜欢的手机,玩的开心才重要。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐