vj网站源码分享(网站源码软件)

大家好,今天来为大家解答vj网站源码分享这个问题的一些问题点,包括网站源码软件也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

概念

单点登录(SingleSign-On,SSO)是一种身份验证服务,允许用户使用单个标识来登录多个应用程序或系统。如下图所示,用户只需要用户名/密码登陆一次就可以访问系统A、系统B和系统C。

在传统的登录方式中,用户必须为每个应用程序或系统提供不同的凭据和密码。如下图所示,用户访问系统A、系统B和系统C都必须用用户名/密码登陆。

这种方式既不方便也容易被攻击者利用,而SSO解决了这个问题,使得用户只需通过一次身份验证就可以无缝地访问多个应用程序或系统,从而提高了用户体验的便利性和安全性。

单点登陆的优点

用户体验改善:用户只需要登录一次,就可以访问多个系统或应用程序,不需要重复输入用户名和密码。这可以大大提高用户的工作效率。安全性增强:单点登陆可以提供更高级别的安全性,因为用户只需要在一个系统中进行身份验证,其他系统就可以共享这个身份验证信息。这可以有效地防止黑客入侵多个系统。管理更方便:单点登陆可以简化管理员的工作,因为它可以集中管理用户和权限。管理员可以在一个系统中管理多个系统的用户和权限,这样可以更方便地进行管理和维护。

单点登陆的实现方式

共享身份验证:多个系统共享一个身份验证系统,用户只需要在一个系统中进行身份验证,就可以访问所有系统。这种方式需要建立一个共享的身份验证系统,这样可以保证用户信息的安全性。代理身份验证:一个系统代表其他系统进行身份验证,用户在登录时输入用户名和密码,然后其他系统会代表用户进行身份验证。这种方式需要建立一个代理系统,这样可以保证用户信息的安全性。基于令牌的身份验证:用户在登录后,会获得一个令牌,这个令牌可以在多个系统上进行身份验证。这种方式需要建立一个令牌管理机制,这样可以保证用户信息的安全性。

实战一

架构图

用户输入用户名/密码登陆ServiceA系统;用户点击ServiceA系统中的某个按钮跳转到ServiceB系统,在跳转时需要带上ServiceA系统颁发的ticket票据;ServiceB系统拿ServiceA系统的ticket去获取ServiceA系统的用户信息;ServiceA系统会校验该ticket票据,然后将用户信息返回给ServiceB系统;ServiceB系统根据用户信息生成token并附带重定向地址返回给ServiceA系统;ServiceA系统就可以拿着获取的token去访问ServiceB系统的资源信息了。

代码实现

数据库

首先是初始化数据库,用户、公司等表依据自己的具体业务而定,此处不再赘述。提供公共的单点登陆信息表。

CREATETABLE`sso_client_detail`(\n`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT&39;,\n`platform_name`varchar(64)DEFAULTNULLCOMMENT&39;,\n`platform_id`varchar(64)NOTNULLCOMMENT&39;,\n`platform_secret`varchar(64)NOTNULLCOMMENT&39;,\n`encrypt_type`varchar(32)NOTNULLDEFAULT&39;COMMENT&39;,\n`public_key`varchar(1024)DEFAULTNULLCOMMENT&39;,\n`sso_url`varchar(128)DEFAULTNULLCOMMENT&39;,\n`remark`varchar(1024)DEFAULTNULLCOMMENT&39;,\n`create_date`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT&39;,\n`create_by`varchar(64)DEFAULTNULLCOMMENT&39;,\n`update_date`datetimeDEFAULTNULLONUPDATECURRENT_TIMESTAMPCOMMENT&39;,\n`update_by`varchar(64)DEFAULTNULLCOMMENT&39;,\n`del_flag`bit(1)NOTNULLDEFAULTb&39;COMMENT&39;,\nPRIMARYKEY(`id`)\n)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4COMMENT=&39;\n

插入测试数据

INSERTINTOcheetah.sso_client_detail\n(id,platform_name,platform_id,platform_secret,encrypt_type,public_key,sso_url,remark,create_date,create_by,update_date,update_by,del_flag)\nVALUES(1,&39;,&39;,&39;,&39;,NULL,&39;,NULL,&39;,&39;,&39;,NULL,0);\n

platform_id和platform_secret,阿Q是使用apache的commons-lang3包下的RandomStringUtils.randomAlphanumeric()方法生成的。sso_url就是上边提到的ServiceB系统的地址。encrypt_type、public_key在此方式中未使用,可以忽略。

细心的阿Q还给大家准备了一个接口,只需要传入platformName和ssoUrl就可以自动生成单点登陆信息。

接下来我们就进入真正的代码部分了,回复“sso”即可获取实战源码。

A跳转B

/**\n*com.itaq.cheetah.serviceA.controller.PortalController34;/jumpB&34;单点登录:{}&34;不存在的app&34;-&34;&34;阿Q&34;ticket&34;请求ServiceB结果:{}&sso\n*获取票据,并请求ServiceA获取用户信息\n*@paramticket票据\n*@return返回地址供sso跳转\n*@throwsJsonProcessingException异常\n*/\n@GetMapping(&34;)\npublicWrapperResult<SsoRespDto>sso(@RequestParam(&34;)Stringticket)throwsJsonProcessingException{\n\tlog.info(&34;,ticket);\n\t//1.根据ticket换取ServiceA用户信息\n\tMap<String,Object>param=newHashMap<>(1);\n\tparam.put(&34;,ticket);\n\tStringssoUrl=&34;;\n\tStrings=HttpRequest\n\t\t\t.get(ssoUrl)\n\t\t\t.queryMap(param)\n\t\t\t.connectTimeout(Duration.ofSeconds(120))\n\t\t\t.readTimeout(Duration.ofSeconds(120))\n\t\t\t.execute()\n\t\t\t.asString();\n\tObjectMapperobjectMapper=newObjectMapper();\n\tobjectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);\n\tWrapperResult<SsoUserInfo>ssoUserInfoWrapperResult=objectMapper.readValue(s,newTypeReference<WrapperResult<SsoUserInfo>>(){\n\t});\n\tlog.info(&34;,newObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(ssoUserInfoWrapperResult));\n\t//2.获取到用户信息之后同步到本地数据库\n\tlog.info(&34;);\n\t//3.生成token\n\tlog.info(&34;);\n\tSsoRespDtorespDto=newSsoRespDto();\n\t//4、将ServiceA要跳转的地址返给ServiceA并携带ServiceB的token\n\trespDto.setRedirectUrl(&34;);\n\tWrapperResult<SsoRespDto>success=WrapperResult.success(respDto);\n\tlog.info(newObjectMapper().writeValueAsString(success));\n\treturnsuccess;\n}\n

A提供的获取用户信息接口

/**\n*com.itaq.cheetah.serviceA.controller.PortalController34;根据ticket获取用户信息&34;/getUser&34;ticket&34;收到票据:{}&34;无法识别的票据信息&本服务的appId和appSecret信息,该配置由serviceA提供\nappId:A9mQUjun\nappSecret:Y6at4LexY5tguevJcKuaIioZ1vS3SDaULwOtXW63buBK4w2e1UEgrKmscjEq\n\nencrypt:\n该配置是serviceA单点登陆serviceB用到的,此处是serviceB单点serviceA,所以用不到\n如果选择非对称加密,则需要使用该配置,该配置由serviceA提供\nserviceA:\nrsa:\npublicKey:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2BF9EZCscKNXYADtulIDNHaMnoxV5Yu91jpv+LiWabW2EO51b8Sx8+Ei59EebM4r+SMal0k4L2Z+cNagQSP4Wvpss82/MkGO8bnAFSxS2SOKw+a+c2PxByWUxvHo4pbyYGFVWAGDXLiI+IqiO/fEFfpy6rYQzMLDnfgMFngdS4AZmRyTdMKbQs8mWqBE5nC0PoU39o/lFowfgelEjHE9vhjtTha67KhYY3n+ueuxsYdRQ40Mg7aQ0+Kt/qKoSn9yRWyx09DheFAkYl4ZCQfd0sMotLQ4BZtk0YWMNHOc1w+fL1bOumaj7AaJi6nM/VvwylLJyia2GjJIDrdTfHiOnwIDAQAB\n

A的配置

serviceA:\nrsa:\nprivateKey:MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDYEX0RkKxwo1dgAO26UgM0doyejFXli73WOm/4uJZptbYQ7nVvxLHz4SLn0R5sziv5IxqXSTgvZn5w1qBBI/ha+myzzb8yQY7xucAVLFLZI4rD5r5zY/EHJZTG8ejilvJgYVVYAYNcuIj4iqI798QV+nLqthDMwsOd+AwWeB1LgBmZHJN0wptCzyZaoETmcLQ+hTf2j+UWjB+B6USMcT2+GO1OFrrsqFhjef6567Gxh1FDjQyDtpDT4q3+oqhKf3JFbLHT0OF4UCRiXhkJB93Swyi0tDgFm2TRhYw0c5zXD58vVs66ZqPsBomLqcz9W/DKUsnKJrYaMkgOt1N8eI6fAgMBAAECggEAA5f23o3rcEwnLd+WFJ08lGjMWe63lwPF+oQqTJa1Wbi9+HYe2ecJlqbN79EYknKzZIdi79U17APmYnYPYEX64Xh8yljHr0xL1lVijneYQShILI3v6PdmkNndKZnoZ6xfB59WzgnoZ2hiTs/vdtPeHQd3VdQFX4J1wnDXsp/4zMKi1fDPt7rhqWrP5W6PXcoGGKIkN9zBlqrd1RBdnKXcwfFoHcFf2ikk6g3Kn50YMRe324eiHMm8z7W34Y3iSvZYHcKBMgsDklFerw1WOGHTN61oMr+8/NTtCsy1AnCH4PrwX/ryO17mh5xNzo/ZSZRRezR92/hmwUIuOO+3FWIE4QKBgQD05wYMVlGKn1fm+sn4hn+ErC6NifXj3MkNdjs8oSHzLrYr6ea6xIvbxesZvqzqz1Fh68bHjpJPOBKwgFnl7+dLXYLNmKjry1iK0o/MMZTtrGUwMEnWHRrpmxXH6B0cnBecZUReuJ9XfKZIfd9ksHHsUY7IGv1CHcblVP/IhrpnxwKBgQDh2/n0cAh1jygGevlXGK/rxuRSlbVgtxJWLAtY8Yolf2BklSiTwmqtp7nzNn8sxRvgfQCZaLqpjC/o/wtC3Ba5b4StJQejoXkCNhVmRdLbIQ2tUxwAElPjFhWf3C5/4B6uBeLyC9izp4wTSYbNbPKxcUGkkfpPbWdHsFZOG4gSaQKBgA/me/cLF6o3ZD6j478WBGt5vmAEKAnOSONt3LS4BXtDeiJpwkg4AJiZRgVa4uEv6qm/5B0KvacVDemVu8B5DfxPqvFsSvNcNXh16U4pnfC8c6loSTL0ms21+vkKsfEslT/bN1ArDnVgq28jdQCVkB/2v51wWycSxdoX5a+AR9P7AoGAMvTwZefI4M0VmLCyBKZ7OlS7Oq6wJ0vmhS6WuNB1/JPKaacFaqDYdKl82JSZCL7H1VQeiH4KbypDvOud3M3PCrNQWcga+x35MTiGh3aFZg8FCO/RR2rbJkbbRh/lFdC420ZUt4tYrt/ESK20DjDgaIxG5RxSPw1N2ey87A5mGtECgYEAlA12yuxBb6qmG3OUSlacSfcKnxZIC3L1IMqxlXL8eG3MB4dI6QYesc3odmaxmy9csgHs+pTyLfM3yB9Ocl572OW5WcEnod5o1EIup9hxB4IG/xSECYVFHlGKfIgbd/JhWtqloYZrwx+kVX/Iw02z18R32DRqBtK4MQ3klOYH86s=\n

B跳转A并加密用户信息

/**\n*com.itaq.cheetah.serviceB.controller.ToServiceAController34;sso&34;AES&34;RSA&34;未配置加密方式&34;signsource={}&34;sso&34;http://localhost:8081/serviceA&34;结果:{}&sso\n*\n*@return\n*/\n@PostMapping\npublicWrapperResult<SsoRespDto>sso(@VerifySignToServiceAReqreq){\n\tlog.info(&34;,JsonUtils.toPrettyString(req));\n\t//同步用户信息\n\n\t//模拟登陆生成token\n\n\t//返回拼接的url?token=xxx\n\t//返回拼接的url?token=xxx\nStringurl=&34;;\nSsoRespDtossoRespDto=newSsoRespDto();\nssoRespDto.setRedirectUrl(url);\nreturnWrapperResult.success(ssoRespDto);\n}\n

你可能会好奇,验签解密的逻辑去哪了?

此处我们通过注解的方式实现自动验签和解密的逻辑,至于具体的逻辑,大家可以回复“sso”获取源码自行解读,当然后续阿Q还会推出新的文章进行详细的讲解,点击关注【阿Q说代码】进行预约吧!

测试

补充知识

本文中用到的RSA的密钥是通过在线网站https://www.bchrt.com/tools/rsa/生成的,当然大家也可以使用hutool中的RSA类来生成,也可以使用java自带的security来生成。

关于vj网站源码分享和网站源码软件的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平