PS:此文章为系列文章,建议从第一篇开始阅读。

资源服务器配置

@EnableResourceServer 注解到一个@Configuration配置类上,并且必须使用ResourceServerConfigurer 这个配置对象来进行配置(可以选择继承自ResourceServerConfigurerAdapter然后覆写其中的方法,参数就是这个对象的实例),下面是一些可以配置的属性:

  • ResourceServerSecurityConfigurer中主要包括:
  1. tokenServices :ResourceServerTokenServices 类的实例,用来实现令牌服务。

  2. tokenStore :TokenStore类的实例,指定令牌如何访问,与tokenServices配置可选

  3. resourceId :这个资源服务的ID,这个属性是可选的,但是推荐设置并在授权服务中进行验证

  4. 其他的拓展属性例如 tokenExtractor 令牌提取器用来提取请求中的令牌。

  • HttpSecurity配置这个与Spring Security类似:
  1. 请求匹配器,用来设置需要进行保护的资源路径,默认的情况下是保护资源服务的全部路径。

  2. 通过 http.authorizeRequests()来设置受保护资源的访问规则

  3. 其他的自定义权限保护规则通过 HttpSecurity 来进行配置。

具体的配置信息如下:

@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class DimplesResourceServerConfigurerAdapter extends ResourceServerConfigurerAdapter { public static final String RESOURCE_ID = "dimples"; @Autowired
private TokenStore tokenStore; @Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources.resourceId(RESOURCE_ID)
.tokenServices(tokenService())
.stateless(true);
} @Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
// 配置客户端权限scope
.antMatchers("/**").access("#oauth2.hasScope('all')")
.and().csrf().disable()
// 关闭session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
} /**
* 资源服务令牌解析服务,调用远程服务解析
*/
/*@Bean
public ResourceServerTokenServices tokenService() {
//使用远程服务请求授权服务器校验token,必须指定校验token 的url、client_id,client_secret
RemoteTokenServices service = new RemoteTokenServices();
service.setCheckTokenEndpointUrl("http://localhost:8080/oauth/check_token");
service.setClientId("dimples");
service.setClientSecret("123456");
return service;
}*/ /**
* 资源服务器令牌解析服务,资源和认证在一起,不用调用远程
*
* @return ResourceServerTokenServices
*/
@Bean
@Primary
public ResourceServerTokenServices tokenService() {
DefaultTokenServices services = new DefaultTokenServices();
// 必须设置
services.setTokenStore(tokenStore);
return services;
} }

tokenService():是配置访问资源服务时传过来的令牌解析服务,有两种情况:

  1. 资源服务器和认证服务器在一起,这是只需要配置默认的DefaultTokenServices即可,但是要注意必须配置一个TokenStore,即是认证服务器中存储令牌的配置,在本地进行解析验证。

  2. 资源服务器和认证服务器不在一起,如微服务中的单独认证服务器和多个资源服务器,这是我们需要配置远程令牌访问解析服务RemoteTokenServices ,配置token的验证端点/oauth/check_token,最终将其配置到资源服务器。要注意的是,一定要在认证服务器中开启相应的端点:

@Override
public void configure(AuthorizationServerSecurityConfigurer security) {
security
// /oauth/token_key公开
.tokenKeyAccess("permitAll()")
// /oauth/check_token公开
.checkTokenAccess("permitAll()")
.allowFormAuthenticationForClients();
}
  1. 如果是资源服务分离情况下,还需要配置Security一个安全控制
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
/**
* 安全拦截机制(最重要)
*/
@Override
protected void configure(HttpSecurity http) throws Exception{
http.csrf().disable()
.authorizeRequests()
//所有/user/**的请求必须认证通过
.antMatchers("/user/**").authenticated()
//除了/user/**,其它的请求可以访问
.anyRequest().permitAll();
}
}

测试资源服务器

新建controller访问链接

@RestController
@RequestMapping("user")
public class UserController { @GetMapping
@PreAuthorize("hasAuthority('admin')")
public DimplesUser user() {
DimplesUser user = new DimplesUser();
user.setUserName("username");
return user;
} }

先通过密码模式获取token

然后带上获取的token去访问相应的资源

token传输格式为 在OAuth2.0中规定:

  1. token必须放在Header中
  2. 对应的格式为:token的参数名称为:Authorization,值为:Bearer token值

如果传错误的token

或者不传token

OAuth + Security - 2 - 资源服务器配置的更多相关文章

  1. OAuth + Security -1 - 认证服务器配置

    配置 基础包依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...

  2. DotNetOpenAuth实践之Webform资源服务器配置

    系列目录: DotNetOpenAuth实践系列(源码在这里) 上篇我们讲到WebApi资源服务器配置,这篇我们说一下Webform下的ashx,aspx做的接口如何使用OAuth2认证 一.环境搭建 ...

  3. DotNetOpenAuth实践之WCF资源服务器配置

    系列目录: DotNetOpenAuth实践系列(源码在这里) 上一篇我们写了一个OAuth2的认证服务器,我们也获取到access_token,那么这个token怎么使用呢,我们现在就来揭开 一般获 ...

  4. OAuth + Security - 3 - JWT令牌

    为什么使用JWT令牌 在上面的资源服务器中,通过配置,我们了解到,当我们拿着token去获取资源时,程序会先去调用远程认证服务器的端点去验证解析token,或者在本地解析校验token,这样毫无疑问, ...

  5. OAuth + Security - 5 - Token存储升级(数据库、Redis)

    PS:此文章为系列文章,建议从第一篇开始阅读. 在我们之前的文章中,我们当时获取到Token令牌时,此时的令牌时存储在内存中的,这样显然不利于我们程序的扩展,所以为了解决这个问题,官方给我们还提供了其 ...

  6. Spring Security 静态资源访问

    在搞 Spring Security 的时候遇到了一个小坑,就是静态资源加载的问题. 当我们继承了 WebSecurityConfigurerAdapter的时候,会去重写几个方法.去设定我们自己要过 ...

  7. Spring Security静态资源访问

    在使用Spring Security时要求所有请求都需要授权访问,此时会定义过滤规则如下 protected void configure(HttpSecurity http) throws Exce ...

  8. springboot配置spring security 静态资源不能访问

    在springboot整合spring security 过程中曾遇到下面问题:(spring boot 2.0以上版本   spring security 5.x    (spring  secur ...

  9. OAuth + Security - 6 - 自定义授权模式

    我们知道OAuth2的官方提供了四种令牌的获取,简化模式,授权码模式,密码模式,客户端模式.其中密码模式中仅仅支持我们通过用户名和密码的方式获取令牌,那么我们如何去实现一个我们自己的令牌获取的模式呢? ...

  10. nginx静态资源服务器配置

    编辑 nginx.conf server { listen 80; server_name file.youxiu326.xin; location /image/ { #访问 file.youxiu ...

随机推荐

  1. 3月2日,阿里云开源 PolarDB 企业级架构将迎来重磅发布

    简介:2022年3月2日,开源 PolarDB 企业级架构将迎来重磅发布!本次发布会将首次公开开源 PolarDB 的总体结构设计和企业级特性,对 PolarDB for PostgreSQL 的存储 ...

  2. TDA-04D8变送器数据上报阿里云

    ​简介:本文将以TDA-04D8变送器作为采集对象,使用海创微联采集控制系统对TDA-04D8变送器进行采集,然后将设备上的毛重.净重.皮重数据采集上传到阿里云物联网平台,阿里云物联网平台将数据实时可 ...

  3. 技术解析:一文看懂 Anolis OS 国密生态 | 龙蜥专场

    ​ 简介: Anolis OS国密是社区在Anolis OS上做的国密技术解决方案. 编者注:本文系两位演讲者整理,他们在2021年阿里云开发者大会的「开源操作系统社区和生态分论坛」上带了分享,演讲主 ...

  4. dotnet 在 UOS 国产系统上使用 MonoDevelop 创建 GTK 全平台带界面应用

    本文告诉大家如何在 UOS 国产系统上开始使用 MonoDevelop 开发,通过创建 GTK# 应用,进入界面开发的第一步 在开始之前需要小伙伴先安装好 MonoDevelop 工具 安装完成之后, ...

  5. async 与 promise 的区别

    async函数会引式返回一个promise,而promise的resolve值就是函数return的值 使用async和await明显节约了不少代码,不需要.then,不需要写匿名函数处理promis ...

  6. CSP-S2023游记

    不知不觉也高二了呢,最后一年OI了. Day -?? 过了初赛.没什么难度. Day -4 模拟赛挂分. RP++. Day -3 模拟赛挂分. RP++. Day -2 没挂分--?换数据了,又挂了 ...

  7. 最好用的AI换脸软件,rope下载介绍(支持cpu)

    随着AI技术的广泛运用,市面上的换脸软件也多了起来,今天给各位介绍其中的王者Rope! 先上两个动图,给大伙看看效果 rope是如何实现这种自然的效果呢?这得益于机器学习技术的不断发展,rope经过深 ...

  8. (更新中)gprMax项目代码分解:gprMax.constants.py、gprMax.exceptions

    目录 1. 引言 2. gprMax.constants.py 3. gprMax.exceptions.py 4. 总结 Reference 1. 引言 本文对gprMax项目中的"gpr ...

  9. python Requests 库的使用

    目录 1. 介绍 2. 安装 3. 基本请求 3.1 get请求 3.2 post请求 3.3 自定义请求头部 3.4 设置超时时间 3.5 代理访问 3.6 session自动保存cookies 3 ...

  10. SHELL脚本获取域名对应的IP地址

    单个获取 编写角本pingip.sh #!/bin/sh ADDR=qq.com TMPSTR=`ping ${ADDR} -c 1 | sed '1{s/[^(]*(//;s/).*//;q}'` ...