案例之把资源交给OAuth2的资源服务管理|学习笔记

简介: 快速学习案例之把资源交给OAuth2的资源服务管理

开发者学堂课程【Spring Security知识精讲与实战演示(四)案例之把资源交给OAuth2的资源服务管理】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/733/detail/13082


案例之把资源交给OAuth2的资源服务管理


将资源交给oauth2的一个资源端,让它来管理,以便其他服务可以直接通过token来访问资源。

需要提供一个配置文件,写上一个config,先指定一个包。oauthSourceconfig,名称不限

image.png

要先声明是一个配置文件,configuration,注解写不写都可以,建议写,算是一种规范,那接下来如何成为0auth2的一个资源服务器呢?首先是enableresouceserver,和web相似,但作用却不一样,这是资源端的一个配置。而用法是差不多的,要想使用它要么有一个接口,要么就继承一个类,所以一般选择继承一个类,这里也可以导包,之后需要对边两个方法进行重写,里边有两个方法,但是默认都是没有任何东西的,所以把它拿过来

image.png

首先要在上面去指定当前使用token,token存储的一个策略。先把它扔到token的策略,放入到ioc容器中,使用public,这里有一个叫tokenstore,就是持久化的意思。选择使用gdbc,名称可以随便起,它是一个接口,可以加上一个bean,这就是指定token的持久化策略,即过来访问资源时会携带一个token,而这会被保存起来,所以这边要提供一个持久化的策略,Ctrl加h,可以看到很多的实现类,例如inmemorytokenstore,表明将token存储在内存。这种方式适合写demo。而真正用在企业开发中就不太好用。还有Redis表示将token存储在Redis中。还有要试用的jdbctokenstore,存储在数据库中。这里可以写return,可以看出它需要一个连接对象,把连接对象放入ioc容器中。已经做了一个配置,那springmvc配置了一个连接对象,它就会放入IOC容器中,同样,在spring boot中配置了连接对象。这个对象就会被放入ioc容器中。只需要将datasource放入到当前的对象中。他会被ioc容器自动扫描,只要扫描到这个类,这些所有注解就都会生效,这里配置了一个持久化的token策略。真正开始配置文件。

首先,需要指定一个resource的ID。来到表结构,有一个resource ids,表示指定当前a系统能访问b系统中哪些resource,那怎么识别,就要给每一个资源都起一个ID,ID是非常重要的一定要写,叫product API,这个是可以随意写但尽量写规范。这就是product_api,id已经指定完,接下来要存储token,所以上一个叫tokenstore,,这里需要一个tokenstore一个对象,所以可以把这个拿过来。这样就可以将token给它做一个存储。上面一步主要是指定当前资源的id和存储方案。接下来,这个http security其实就是spring security的一个配置文件。在上面的表的字段中可以来到上面表的字段,这里有一个叫scope的一个字段,这个字段就是指定资源的读或者是写,这里也可以指定每一种请求都需要哪一个,所以要指定这个东西,这个也是类似于访问权限。那一般的情况下可以认为这是一段固定的配置,就是增删改都是需要读和写,get是需要读的权限,把这段配过来其实就好。

//指定不同请求方式访问资源所需要的权限,一般查询是read,其余是write。

antMatchers(HttpMethod.GET, "/**").access("#oauth2.hasScope( "read')") antMatchers(HttpMethod.POST, "/**").access("#oauth2.hasScope('write')") antMatchers(HttpMethod.PATCH, "/**").access("#oauth2.hasScope("write')") antMatchers(HttpMethod.PUT, "/**").access("#oauth2.hasScope("write')")

.antMatchers(HttpMethod.DELETE, “/**").access("#oauth2.hasScope('write')".and()

注意,一个系统a,要访问系统b,那a系统与b系统它不是一个项目,那将来在线上也不是一个域名,不是一个域名,如果发送请求,正常情况下两个系统之间的调用,为了安全,期间还需要阿贾克斯请求,只要不是一个域名,域名不一样,包括子域名不一样也不行,只要域名或者子域名不一样,而且请求就会出现跨域问题,出现跨域问题,a系统就无法访问b系统,如果想正常访问,需要在b系统中来对a系统进行一个特殊的释放,允许它跨域来访问就可以,那这段位置可以认为是固定的,添加一个头衔,

Access-Control-Allow-Origin

写上一个头衔,注意不要写错,因为写错任意一个字母,就不能访问了,允许跨域,下面这一句有个叫OPTION的一个方法,注意这是一个方法名,这个方法并不是自己写的方法,只要出现跨域,只要出现跨域的情况,都会有一个叫预检请求,可以这样理解,a系统去访问系统,域名不一样,就会认为这就是一个跨域的请求。跨域的请求就会出现预检请求。这个预检请求就是事先预见一下a系统能否访问b系统,如果不能通过预检请求,后续真正的请求也不会被发出,代码

if (request.getMethod().equals("OPTIONS”))

如果出现预检请求,把之前所有的头信息原封不动的带下去,否则预检请求之后会丢失这些头信息,如果头信息丢失,基本上来说a系统到b中如果有一个头信息就接收不到,所以头信息必须要原封不动往下封装,否则即便是a系统到b系统,请求头信息里面放了一个token,而b系统得不到丢失了,就等于没有给token,依然不允许访问,所以要注意,这对于原请求如果出现就将请求直接传达下去,不传达语言之后,头信息就丢失,那这一段可以认为是固定配置。

//指定不同请求方式访问资源所需要的权限,一般查询是read,其余是write。

antMatchers(HttpMethod.GET, "/**").access("#oauth2.hasScope( "read')") antMatchers(HttpMethod.POST, "/**").access("#oauth2.hasScope('write')") antMatchers(HttpMethod.PATCH, "/**").access("#oauth2.hasScope("write')") antMatchers(HttpMethod.PUT, "/**").access("#oauth2.hasScope("write')")

.antMatchers(HttpMethod.DELETE, “/**").access("#oauth2.hasScope('write')".and() 

可以把日志整理一下,可能有些格式需要改动一下。到此可以认为现在搭建的这台服务器已经交给oauth2的资源管理。

@Override

public void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

W/指定不同请求方式访问资源所需要的权限,一般查询是read,其余是write。

.antMatchers(HttpMethod.GET,…antPatterns:"/**").access(attribute:"#oauth2.hasScope('read’)") antMatchers(HttpMethod.POST,…antPatterns:"/**"). access(attribute: "#oauth2.hasScope('write’)")

santVatchers(HttplethodPATCHantPattern:** access(attribute:"#oauth2.hasScone(write))

santMatchers(HttpMethod.PUT…antPatterns:"/**"). access( attribute:"#oauth2.hasScope('write’)".antMatchers(HttpMethod.DELETE antPatterns: "/**").access( attribute: "#oauth2. hasScope('write’)").and()

headers().addHeaderWriter((request,response)-> {

response.addHeader(s:"Access-Control-A1low-0rigin",s1:"*");//允许跨域

if (request.getMethod().equals("OPTIONS”)){//如果是跨域的预检请求,则原封不动向下传达请求头信息

response.setHeader(s:"Access-Control-A1low-Methods",request. getHeader(s:"Access-Control-Request-Method")):

response.setHeader(s:"Access-Control-A1low-Headers",request.getHeader(s: "Access-Control-Request-Headers"));

}});}

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
22天前
|
安全 Java 数据库
后端进阶之路——浅谈Spring Security用户、角色、权限和访问规则(三)
后端进阶之路——浅谈Spring Security用户、角色、权限和访问规则(三)
|
安全 Java 数据安全/隐私保护
OAuth2.0实战!玩转认证、资源服务异常自定义这些骚操作!
OAuth2.0实战!玩转认证、资源服务异常自定义这些骚操作!
SpringMVC学习(八):使用RESTFul模拟操作用户数据资源
SpringMVC学习(八):使用RESTFul模拟操作用户数据资源
156 0
SpringMVC学习(八):使用RESTFul模拟操作用户数据资源
|
安全 Java 关系型数据库
案例之创建资源服务器准备工作|学习笔记
快速学习案例之创建资源服务器准备工作
97 0
案例之创建资源服务器准备工作|学习笔记
|
存储 安全 Java
案例之oauth2认证所需资源说明|学习笔记
快速学习案例之oauth2认证所需资源说明
108 0
案例之oauth2认证所需资源说明|学习笔记
|
安全 Java 开发者
案例之资源服务中加入校验用户所需对象|学习笔记
快速学习案例之资源服务中加入校验用户所需对象
64 0
案例之资源服务中加入校验用户所需对象|学习笔记
|
前端开发 IDE Java
Javaweb学习笔记(二)之发布动态资源
本文主要介绍了Javaweb项目实践案例,即发布动态资源和Servlet的简单介绍。
252 0
Javaweb学习笔记(二)之发布动态资源
|
安全 JavaScript 前端开发
OAuth2的定义和运行流程
开放授权(Open Authorization OAuth) 是一种资源提供商用于授权第三方应用代表资源所有者获取有限访问权限的授权机制。由于在整个授权过程中,第三方应用都无法触及用户的密码就可以获取部分资源的使用权限,所以OAuth是开放安全的。
OAuth2的定义和运行流程
|
Web App开发 移动开发 JavaScript
关于源码及资源的说明
关于源码及资源的说明
92 0
关于源码及资源的说明
|
Java 应用服务中间件 Linux
扩展资源服务器解决oauth2 性能瓶颈
用户携带token 请求资源服务器 资源服务器拦截器 携带token 去认证服务器 调用tokenstore 对token 合法性校验 资源服务器拿到token,默认只会含有用户名信息 通过用户名调用userdetailsservice.
1785 0