spring boot +vue用什么记录登录状态_如何实现单点登录功能(赋代码)

技术这东西吧,看别人写的好像很简单似的,到自己去写的时候就各种问题,“一看就会,一做就错”。网上关于实现SSO的文章一大堆,但是当你真的照着写的时候就会发现根本不是那么回事儿,简直让人抓狂。几经曲折,终于搞定了,决定记录下来,以便后续查看。先来看一下效果

e4f62ec9dfa3c548d4c0935f488c85a6.png

b87ea460dbeeaf8d1938c3501d8558d0.png

a9bacf5d273af71f35aa36ef0f7070a8.png

2. 准备

2.1. 单点登录

最常见的例子是,我们打开淘宝APP,首页就会有天猫、聚划算等服务的链接,当你点击以后就直接跳过去了,并没有让你再登录一次

06826fe5054de8e122de397c51602ed6.png

下面这个图是我再网上找的,我觉得画得比较明白:

9c5518d4b6a4adad6f27bacd696d5652.png

可惜有点儿不清晰,于是我又画了个简版的:

重要的是理解:

  • SSO服务端和SSO客户端直接是通过授权以后发放Token的形式来访问受保护的资源
  • 相对于浏览器来说,业务系统是服务端,相对于SSO服务端来说,业务系统是客户端
  • 浏览器和业务系统之间通过会话正常访问
  • 不是每次浏览器请求都要去SSO服务端去验证,只要浏览器和它所访问的服务端的会话有效它就可以正常访问

3759beea9faac7caf873b444c8c3a521.png

2.2. OAuth2

推荐以下几篇博客

《OAuth 2.0》https://www.cnblogs.com/cjsblog/p/9174797.html《Spring Security对OAuth2的支持》https://www.cnblogs.com/cjsblog/p/9184173.html

3. 利用OAuth2实现单点登录

接下来,只讲跟本例相关的一些配置,不讲原理,不讲为什么

众所周知,在OAuth2在有授权服务器、资源服务器、客户端这样几个角色,当我们用它来实现SSO的时候是不需要资源服务器这个角色的,有授权服务器和客户端就够了。

授权服务器当然是用来做认证的,客户端就是各个应用系统,我们只需要登录成功后拿到用户信息以及用户所拥有的权限即可

之前我一直认为把那些需要权限控制的资源放到资源服务器里保护起来就可以实现权限控制,其实是我想错了,权限控制还得通过Spring Security或者自定义拦截器来做

3.1. Spring Security 、OAuth2、JWT、SSO

在本例中,一定要分清楚这几个的作用

首先,SSO是一种思想,或者说是一种解决方案,是抽象的,我们要做的就是按照它的这种思想去实现它

其次,OAuth2是用来允许用户授权第三方应用访问他在另一个服务器上的资源的一种协议,它不是用来做单点登录的,但我们可以利用它来实现单点登录。在本例实现SSO的过程中,受保护的资源就是用户的信息(包括,用户的基本信息,以及用户所具有的权限),而我们想要访问这这一资源就需要用户登录并授权,OAuth2服务端负责令牌的发放等操作,这令牌的生成我们采用JWT,也就是说JWT是用来承载用户的Access_Token的

最后,Spring Security是用于安全访问的,这里我们我们用来做访问权限控制

4. 认证服务器配置

4.1. Maven依赖

<?

这里面最重要的依赖是:spring-security-oauth2-autoconfigure

4.2. application.yml

spring:
  

4.3. AuthorizationServerConfig(重要)

package 

说明:

  1. 别忘了@EnableAuthorizationServer
  2. Token存储采用的是JWT
  3. 客户端以及登录用户这些配置存储在数据库,为了减少数据库的查询次数,可以从数据库读出来以后再放到内存中

4.4. WebSecurityConfig(重要)

/**

4.5. 自定义登录页面(一般来讲都是要自定义的)

package 

自定义登录页面的时候,只需要准备一个登录页面,然后写个Controller令其可以访问到即可,登录页面表单提交的时候method一定要是post,最重要的时候action要跟访问登录页面的url一样

千万记住了,访问登录页面的时候是GET请求,表单提交的时候是POST请求,其它的就不用管了

<!

4.6. 定义客户端

be5d557ce172b6ea62a5de07aeaf9a61.png

032f39a456e3f72b087ab0dc3b59cf27.png

4.7. 加载用户

登录账户

/**

加载登录账户

package 

4.8. 验证

303992f77222c52e77aff0f2e8fe587a.png

当我们看到这个界面的时候,表示认证服务器配置完成

5. 两个客户端

5.1. Maven依赖

<?

5.2. application.yml

server:
  

8edc38a50dd2bd53a289ca0ea5fce517.png

这里context-path不要设成/,不然重定向获取code的时候回被拦截

5.3. WebSecurityConfig

package 

说明:

  1. 最重要的注解是@EnableOAuth2Sso
  2. 权限控制这里采用Spring Security方法级别的访问控制,结合Thymeleaf可以很容易做权限控制
  3. 顺便多提一句,如果是前后端分离的话,前端需求加载用户的权限,然后判断应该显示那些按钮那些菜单

5.4. MemberController

package 

5.5. Order项目跟它是一样的

server:
  

5.6. 关于退出

退出就是清空用于与SSO客户端建立的所有的会话,简单的来说就是使所有端点的Session失效,如果想做得更好的话可以令Token失效,但是由于我们用的JWT,故而撤销Token就不是那么容易,关于这一点,在官网上也有提到:

fc5bb5cdb532a3ffd2d819cf425033e5.png

本例中采用的方式是在退出的时候先退出业务服务器,成功以后再回调认证服务器,但是这样有一个问题,就是需要主动依次调用各个业务服务器的logout

6. 工程结构

ad3680a7a29292fbee8749a64f0a9af2.png

附上源码:https://github.com/chengjiansheng/cjs-oauth2-sso-demo.git

7. 演示

ffc959aef1c18dafd01eb52b06696954.png

8. 参考

https://www.cnblogs.com/cjsblog/p/9174797.html

https://www.cnblogs.com/cjsblog/p/9184173.html

https://www.cnblogs.com/cjsblog/p/9230990.html

https://www.cnblogs.com/cjsblog/p/9277677.html

https://blog.csdn.net/fooelliot/article/details/83617941

http://blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/

https://www.cnblogs.com/lihaoyang/p/8581077.html

https://www.cnblogs.com/charlypage/p/9383420.html

http://www.360doc.com/content/18/0306/17/16915_734789216.shtml

https://blog.csdn.net/chenjianandiyi/article/details/78604376

https://www.baeldung.com/spring-security-oauth-jwt

https://www.baeldung.com/spring-security-oauth-revoke-tokens

https://www.reinforce.cn/t/630.html

9. 文档

https://projects.spring.io/spring-security-oauth/docs/oauth2.html

https://docs.spring.io/spring-security-oauth2-boot/docs/2.1.3.RELEASE/reference/htmlsingle/

https://docs.spring.io/spring-security-oauth2-boot/docs/2.1.3.RELEASE/

https://docs.spring.io/spring-security-oauth2-boot/docs/

https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/

https://docs.spring.io/spring-boot/docs/

https://docs.spring.io/spring-framework/docs/

https://docs.spring.io/spring-framework/docs/5.1.4.RELEASE/

https://spring.io/guides/tutorials/spring-boot-oauth2/

https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#core-services-password-encoding

https://spring.io/projects/spring-cloud-security

https://cloud.spring.io/spring-cloud-security/single/spring-cloud-security.html

https://docs.spring.io/spring-session/docs/current/reference/html5/guides/java-security.html

https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot-redis.html#boot-spring-configuration

JeecgBoot是一个基于Spring Boot和MyBatis的快速开发平台,它提供了一套代码生成器,可以快速生成前后端代码Vue3是一种流行的JavaScript框架,用于构建用户界面。TypeScript是JavaScript的超集,它添加了静态类型检查和其他一些特性。 单点登录(Single Sign-On,简称SSO)是一种身份验证和授权机制,允许用户使用一组凭据(例如用户名和密码)登录到一个系统,并在登录后访问其他相关系统而无需重新进行身份验证。在JeecgBoot + Vue3 + TypeScript中实现单点登录可以通过以下步骤: 1. 配置认证中心:搭建一个认证中心,用于处理用户的身份验证和授权。可以使用开源的认证中心,如CAS(Central Authentication Service)或Keycloak。 2. 配置客户端应用:在JeecgBootVue3应用中配置客户端应用,以便与认证中心进行通信。这包括配置认证中心的URL、客户端ID和密钥等信息。 3. 实现认证流程:在JeecgBoot实现认证流程,包括接收来自认证中心的认证请求、验证用户凭据、生成并返回访问令牌等。 4. 实现授权流程:在Vue3应用中实现授权流程,包括将用户重定向到认证中心进行登录、接收并解析访问令牌、验证令牌的有效性等。 5. 共享会话信息:在JeecgBootVue3应用之间共享会话信息,以便在用户登录后可以在不同应用之间共享身份验证状态。 6. 实现单点注销:在JeecgBootVue3应用中实现单点注销功能,允许用户在一个应用注销后自动注销其他相关应用。 以上是基本的步骤,具体实现细节可能会因具体的技术选型和需求而有所不同。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值