前后端分离Oauth2.0 - springsecurity + spring-authorization-server —序言

序言

文章将介绍oauth2.0的相关概念,应用场景,前后端分离实现oauth2.0颁发Token的思路,实践环境的前提。

OAuth 2.0 是什么

OAuth 2.0 是一种授权机制,主要用来颁发令牌(token)。

认证:

用户名 + 密码 进行登录,验证用户名密码是否正确,为认证,认证你就是系统中的用户本人。

授权:

认证通过后会将用户本人的信息生成一个授权层所用的令牌(token)。
此处的授权使用Oauth2.0,可以通过不同的互联网场景使用其不同的授权方式。

推荐博文:

OAuth 2.0 的四种授权方式
OAuth 2.0 的四种授权方式-图解

需求和思路

前提:

每一个系统本着注册用户不能流失的原则。以此为出发点,思考这个用户使用手机注册,或者邮箱注册,或者两者做了关联,或者使用了第三方的登录。在用户注册时,其手机号或者邮箱在系统中必须是唯一的。

需求一
域名:使用公司自己的域名  www.authorization.life 进行登录。
logo:使用租户公司自己的logo。
数据:需要做隔离。
思路:
1、www.authorization.life 业务系统中,进行用户信息注册。
2、system.authorization.life  运营系统中,运营管理员进行用户信息审核。
3、审核通过后对此用户的信息进行 创建租户信息,**创建 oauth2.0所需要使用的 client信息**,指定租户的管理员,进而为此租户进行分配模块、菜单、接口、按钮等功能。
4、用户登录成功后可以查看注册时填写的logo信息(此处为展示公司产品的专业能力),在设置模块中查看注册信息,或者进行编辑更改。
5、在每一个接口传参的过程中需要将当前登录用户关联的租户编码,作为参数可进行数据隔离。
需求二
域名:租户要求 需要使用  自己的公司的名字作为三级域名,或者说如果需要客户要求使用自己公司的名字作为域名登录,则只能指定三级域名为租户公司的名字,进行登录, 比如 csdn.authorization.life ,juejin.authorization.life 。

说明:域名级数是指一个域名由多少级组成,域名的各个级别被“.”分开,最右边的那个词称为顶级域名。由右往左,依次为顶级域名,二级域名,三级域名,四级域名等。

logo:使用租户公司自己的logo。
数据:需要做隔离。
思路:
1、www.authorization.life 业务系统中,进行用户信息注册。
2、system.authorization.life  运营系统中,运营管理员进行用户信息审核。
3、审核通过后对此用户的信息进行 创建租户信息,**创建 oauth2.0所需要使用的 client信息,指定所需要登录的域名**,租户的管理员,进而为此租户进行分配模块、菜单、接口、按钮等功能。
4、后续操作与需求一的步骤一致。

实现前后端分离

目标:

系统中我们将使用前后端分离的开发模式,用户信息使用jwt进行解析或存储,掌握 当前accessToken中的信息,针对不同的租户,创建不同的client信息。每一个需要登录/认证信息的地方,都需要创建 client信息,指定关联的租户信息。在对于私有化部署,接收客户方自己的数据时,定制化开发功能模块,都可以针对不同的client信息做判断。

思路:

1、通过nginx中监听域名(监听域名也可以是正则表达式,通配符做匹配),指定不同的路径代理不同的前端(vue)工程,浏览器通过访问不同的路径,访问不同的前端工程/后端工程。

1.1、以此为出发点,在直接访问域名时,默认访问的是根路径 / ,在gateway网关中配置自定义路由(RouterFunction),将直接跳转到 /login ,此时nginx将通过代理,通过路径“/login”访问vue前端login工程,这个时候就可以理解为我们自定义了springsecurity的登录页面,其登录页面在 vue前端login工程中.
在这里插入图片描述
1.2、 进入前端页面后将输入用户名密码,请求login接口,对用户名和密码进行校验,以及校验不通过时可以进行用户的锁定,发送解锁邮件。

2、将认证服务和授权服务放在一个服务中,将重写oauth2.0中用于使用临时授权码的同意授权服务(OAuth2AuthorizationConsentService),授权服务(OAuth2AuthorizationService),注册客户端服务(RegisteredClientRepository)。默认的oauth2.0的三张表,将替换为:lifetime_oauth_client(oauth客户端表)、lifetime_user(用户表)、lifetime_user_group(用户组表)。
2.1、自定义 RegisteredClientRepository 将从数据库中查询 自定义的client端信息,对每一个client端的设置通过数据库中的信息进行设置,比如 可以配置当前accesstoken的生成格式,过期时间等。

2.2、自定义 OAuth2AuthorizationService 将保存授权的用户信息。
2.3、自定义 OAuth2AuthorizationConsentService 将保存同意的临时授权码中的信息。
2.4、自定义 OAuth2TokenCustomizer 将重写 oauth/token接口返回access_token中的内容,可以进行定义和修改,定义jwt中的 claim 信息或者 header 信息,在此处可以做更多的扩展或者新的想法,需要发挥想象让accessToken提供自己平台系统中所需要的信息。
在这里插入图片描述

3、将对accesstoken存储到cookie中,为下一次请求数据而做准备。

4、
框架选择:

		java 17 
        boot:2.7.3
        cloud:2021.0.3
        cloud-alibaba:2.2.8.RELEASE
        spring-security:5.7.3
        authorization-server:0.3.1

中间件选择:

		mysql 8.0 
        nginx 域名+路径的代理
        nacos 注册中心
        redis  存储用户信息
        docker  部署redis等

nginx

在此处将nginx的配置贴出来,配置了80 端口将访问443端口,其不同路径的代理配置在443端口中进行配置。


		# 授权服务
    server {
        listen       80;
        server_name  www.authorization.life;
        rewrite ^(.*)$ https://$server_name$1 permanent;
    }
    
    # HTTPS server 参考配置: https://nenufm.com/archives/g
    server {
        listen       443 ssl;
        server_name  www.authorization.life;

        ssl_certificate      D://authorization_life_aliyun//authorization_life_chain.pem;
        ssl_certificate_key  D://authorization_life_aliyun//authorization_life_key.key;

		    # ssl验证相关配置
		ssl_protocols 			TLSv1.3 SSLv3; #安全链接可选的加密协议
        ssl_ciphers         EECDH+AESGCM:EDH+AESGCM;
        ssl_ecdh_curve 			secp384r1; #为ECDHE密码指定 SEPO384Q1
		ssl_session_timeout  10m;    #缓存有效期
        ssl_session_cache   shared:SSL:10m;
		ssl_prefer_server_ciphers   on; 
    	ssl_session_tickets         off; # Requires nginx >= 1.5.9
    	ssl_stapling                on; # Requires nginx >= 1.3.7
    	ssl_stapling_verify         on; # Requires nginx => 1.3.7

				#后端服务gateway
        location / {
		        proxy_pass http://127.0.0.1:9000;
        }
        # 前端登录工程
        location /login {
		        proxy_pass http://127.0.0.1:8080;
		        proxy_http_version 1.1;
    			proxy_set_header Upgrade $http_upgrade;
    			proxy_set_header Connection $connection_upgrade;
        }

    }
    

域名

阿里云注册域名:https://wanwang.aliyun.com/domain/
申请证书:
在阿里云中个人账户是可以免费申请ssl证书20个。
在这里插入图片描述

结语

由于 spring-authorization-server 在 0.3 版本中将隐式授权方式删除,此专栏将实践 授权码(authorization-code)方式、客户端凭证(client credentials)方式。
github地址: https://github.com/qjyn1314/authorization-life

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 前后端分离是一种将前端界面与后端逻辑进行分离开发的架构方式,使得前端与后端可以并行开发。OAuth 2.0是一种授权框架,用于授权和认证流程的规范化,而Spring Security是一个在Java中实现安全控制的框架,提供了大量的安全特性。Spring Authorization ServerSpring Security中用于实现授权服务器的模块,它支持OAuth 2.0的各种授权模式。 密码模式是OAuth 2.0中的一种授权模式,它允许用户通过提交用户名和密码来获取访问令牌,然后使用该令牌来访问受保护的资源。在前后端分离的架构中,可以使用Spring Security配合Spring Authorization Server来实现密码模式的认证和授权。 在密码模式下,前端首先需要收集用户的用户名和密码,并将其发送给后端。后端使用Spring Security提供的密码编码器对密码进行加密,并验证用户名和密码的正确性。如果验证通过,则后端向客户端颁发一个访问令牌,通常是一个JWT(JSON Web Token)。前端使用获得的访问令牌来访问需要受保护的资源,每次请求将该令牌作为Authorization头的Bearer字段发送给后端进行验证。后端可以使用Spring Security的资源服务器来验证该令牌的有效性,并根据用户的权限控制对资源的访问。 使用Spring SecuritySpring Authorization Server的密码模式可以实现安全的前后端分离架构。通过合理配置和使用安全特性,可以保障用户的身份认证和资源的授权,确保系统的安全性。 ### 回答2: 前后端分离是一种软件架构模式,前端和后端通过使用API进行通信,分别负责处理用户界面和数据逻辑。OAuth 2.0是一种用于授权的开放标准协议,它允许用户在第三方应用程序中授权访问其受保护的资源。Spring SecuritySpring框架中的一个模块,提供了身份验证和授权功能。 在前后端分离的架构中,前端应用程序通常需要使用OAuth 2.0协议进行用户授权,以访问后端应用程序的受保护资源。为了实现密码模式,我们可以使用Spring Security的模块之一,即spring-authorization-serverspring-authorization-serverSpring Security的一个子模块,用于实现OAuth 2.0协议中的授权服务器。密码模式是OAuth 2.0协议中的一种授权模式,允许前端应用程序通过用户的用户名和密码进行授权。密码模式在安全性上有一定的风险,因此在实际应用中需要谨慎使用。 使用spring-authorization-server的密码模式,我们可以在前端应用程序中收集用户的用户名和密码,并将其提交给后端应用程序进行验证。后端应用程序将使用Spring Security进行身份验证,并向前端应用程序颁发一个访问令牌,该令牌可以用于后续的API请求。 通过使用前后端分离、OAuth 2.0和spring-authorization-server的密码模式,我们可以实现安全的用户授权和身份验证机制,确保只有经过授权的用户才能访问受保护的资源。这种架构模式能够提高系统的安全性和可扩展性,适用于各种类型的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值