当前位置: 首页 > 知识库问答 >
问题:

java - SpringBoot如何实现前后端分离统一认证与授权?

袁开宇
2024-07-01

前言:

1.公司有多个项目组,每个项目组做不同的系统(应用),每个应用都相当于oauth中的一个client
2.登陆页面项目组可以根据自己的风格设计登陆页,但都访问同一个登陆接口
3.用户登陆获取到的token与应用token需要分开(用户有的权限应用不一定有,应用有的权限用户不一定有)

需求:

1.登陆:
    1.1:用户访问某一个系统界面时判断是否携带有效token,没有则跳转至登陆界面,url上拼接登陆成功的跳转地址及client_id(这里与oauth2客户端模式不同不需要携带client_secret)
    1.2:登陆常规校验及同时校验client_id是否与请求来源的域名匹配
    1.3:登陆成功则记录当前用户是通过那个系统登陆的
2.服务端认证
    2.1:因每个项目组的应用都会提供一些开放接口给其他项目组使用。如【OA服务】需要向【考勤服务】查询数据,则需使用【OA服务】的client_id和client_secret生成token进行访问且需要校验是否有权限去访问【考勤服务】

疑问点:

1.用户访问界面时,是否是由服务端的判断没有token则重定向登陆页面,还是返回状态码由前端跳转至登陆界面。 这两种情况如何把client_id给到前端让其登陆时传给服务端
2.只使用spring security能否实现以上需要,还是需要接入spring authorization server等框架。
3.但接入spring authorization server框架在登陆时是否可以不传client_secret

好晕。。。

共有2个答案

施令秋
2024-07-01

其实就是看第一点就决定用什么,公司有多个项目组,每个项目组做不同的系统(应用),每个系统是不是用的不同用户,如果每套系统用的是不同用户,那就是用 spring authorization server, 如果都用的是同一个用户,那就是 spring security

疑问点:
1:client_id 本来就是一开始就知道的,是一个固定的呀。
2:就我上面说的,
3:你还是先了解一下 spring authorization server,这个例子,你git下来跑一次应该能大致理解,https://github.com/spring-projects/spring-authorization-server/tree/main/samples#demo-sample

颜实
2024-07-01

回答

1. 用户访问界面时,如何传递 client_id

在前后端分离的应用中,当用户访问某个系统界面时,如果未携带有效token,后端可以返回一个状态码(如401 Unauthorized)以及一个包含client_id的跳转链接或者是在响应的header中设置Location重定向的URL(包含client_id)。前端接收到这个状态码或响应后,会进行逻辑判断并自动跳转到登录页面,同时带上这个client_id参数。

2. 是否只使用Spring Security就能实现上述需求

Spring Security可以处理用户的身份验证和授权,但是它本身并不直接支持OAuth 2.0的全部特性,特别是关于客户端认证的部分。Spring Security OAuth2 Client是一个扩展模块,但它已经被标记为不再推荐使用,因为Spring Security 5.x及以后版本推荐使用Spring Security 5 OAuth2 Login和Spring Authorization Server。

要完整地实现OAuth 2.0的认证和授权流程(包括客户端认证),你可能需要结合使用Spring Security和Spring Authorization Server(或者一个外部的OAuth 2.0授权服务器,如Keycloak、Okta等)。

3. 接入Spring Authorization Server时是否可以不传client_secret

在OAuth 2.0的客户端认证流程中,client_secret是一个敏感信息,用于验证客户端的身份。在标准的OAuth 2.0流程中,当客户端(如你的OA服务)需要获取访问令牌(access token)时,通常需要提供client_idclient_secret

然而,对于前端应用(如SPA,Single Page Application),出于安全考虑,通常不会将client_secret存储在前端代码中。对于这些情况,OAuth 2.0提供了其他授权流程(如授权码流程、隐式流程等),这些流程允许前端应用在不使用client_secret的情况下安全地获取访问令牌。

但是,对于你的后端服务之间的通信(如OA服务向考勤服务请求数据),使用client_idclient_secret进行客户端认证是常见的做法,以确保请求的来源是可信的。因此,在这些情况下,你需要提供client_secret

总结

  • 对于前端用户的登录和认证,你可以使用Spring Security结合自定义的登录页面和流程来实现。
  • 对于后端服务之间的通信和认证,你可能需要结合使用Spring Security和Spring Authorization Server(或外部OAuth 2.0授权服务器)来实现OAuth 2.0的客户端认证和授权流程。
  • 在OAuth 2.0的客户端认证流程中,client_secret是一个敏感信息,需要妥善保管和使用。对于前端应用,通常不会使用client_secret;但对于后端服务之间的通信,使用client_idclient_secret进行认证是常见的做法。
 类似资料:
  • 本文向大家介绍Springboot如何实现Web系统License授权认证,包括了Springboot如何实现Web系统License授权认证的使用技巧和注意事项,需要的朋友参考一下 在我们做系统级框架的时候,我们要一定程度上考虑系统的使用版权,不能随便一个人拿去在任何环境都能用,所以我们需要给我们系统做一个授权认证机制,只有上传了我们下发的lic文件并验证通过,才能正常使用,下面就开始一步一步实

  • 本文向大家介绍VUE+node(express)实现前后端分离,包括了VUE+node(express)实现前后端分离的使用技巧和注意事项,需要的朋友参考一下 vue作为前端的框架,node(express)作为后端的框架。无数据库,使用端口保存数据。 VUE: 使用vue-cli构建vue项目(vueapp)。 axios:(与ajax相似) axios没安装的记得装一下。(安装不细说) nod

  • 前后端分离 在B/S架构的环境中,前后端分离一直都众说纷纭,没有一个标准。我觉得打开可以分为三个阶段: 传统的分离方法 传统意义上的前后端分离,前端指的是美工、切图、设计,后端是实现代码、数据库相关的实现。美工设计和生成的前端页面,给到程序员来做集成。那么这里其实就不分什么前后端了,程序员从数据库一直搞到前端页面的样式,就是“全能型运动员“。当然,一般传统上的开发协作模式有两种: 一种是前端先写一

  • ModStart:系统是前后端分离的吗?

  • 前端使用vue,后端使用springboot,前后端分离,且已解决跨域,登录采用jwt验证 想实现功能:如果用户通过url栏输入地址方式来访问某个页面(非登录页),对未登录用户自动跳转登录页面 请问拦截器是设置在后端还是设置在前端?另外对于静态页面能拦截吗

  • 问题内容: 我正在开发一个新项目,其中react / express作为前端,而loopback作为后端api。我在开发环境中使用不同的端口将它们分开。 我应该如何在生产中部署它们? 托管在同一服务器上-将后端与其他子域分开? 在2台不同的服务器上托管-似乎无法使用同一域。 问题答案: 您可以部署 您的 静态托管服务* 和 CDN 前端 *** AWS S3 + AWS CloudFront Go

  • 1. 前言 目前,使用 Spring Boot 进行前后端分离项目开发,应该是主流做法了。这种方式,在开发、测试阶段,都比较方便。 开发阶段,项目组定义好接口规范后,前端按规范开发前端页面,后端按规范编写后端接口,职责分明。 测试阶段,后端是独立项目,可以进行单元测试。前端可以随时使用最新版本的后端程序进行实际测试。 前后端分离的模式,有着很多的优越性,所以造就了它的流行。 2. 技术选型 本篇我

  • 我想建立小型应用程序。会有一些用户。我不想做自己的用户系统。我想将我的应用程序与oauth/oauth2.0集成。 集成我的前端应用程序和oauth 2.0没有问题。有很多有用的文章,如何做到这一点,即使在 stackoverflow.com 上。例如,这篇文章非常有帮助。 但是。在前端成功授权后,我该怎么办?当然,我可以在客户端上有标志,上面写着“好的,伙计,用户已通过身份验证”,但是我现在应该