在上一篇文章[Spring Security OAuth2.0认证授权一:框架搭建和认证测试](https://www.cnblogs.com/kuangdaoyizhimei/p/14250374.html) 详细讲解了如何搭建一个基于spring boot + oauth2.0的认证服务,这篇文章将会介绍如何搭建一个资源服务。

根据oath2.0协议内容,应当有一个资源服务管理资源服务并提供访问安全控制。

1. 引入maven依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

这里虽然引入了jwt的依赖,但是暂时还未用到。

2. 配置配置文件

server:
port: 30001
spring:
application:
name: resource-server

3. 新建启动类

@SpringBootApplication
public class ResourceServerApplication { public static void main(String[] args) {
SpringApplication.run(ResourceServerApplication.class, args);
}
}

4. Resource服务核心配置

4.1 新建ResouceServerConfig类

该类需要继承ResourceServerConfigurerAdapter类并需要使用@EnableResourceServer注解注释。

@Configuration
@EnableResourceServer
public class ResouceServerConfig extends ResourceServerConfigurerAdapter {
......
}

4.2 核心配置

重写ResouceServerConfig类以下方法以实现ResourceServer的基本配置:

org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter#configure(org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer)

@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources
.resourceId(RESOURCE_ID)
.tokenServices(resourceServerTokenServices)//令牌服务
.stateless(true);
}
  • resourceId方法标志了该服务的id,需要和在auth-center服务中配置的id一致。
  • tokenServices方法指定了令牌管理的实例,Bean创建方法如下
    @Bean
    public ResourceServerTokenServices resourceServerTokenServices(){
    RemoteTokenServices remoteTokenServices = new RemoteTokenServices();
    remoteTokenServices.setCheckTokenEndpointUrl("http://127.0.0.1:30000/oauth/check_token");
    remoteTokenServices.setClientId("c1");
    remoteTokenServices.setClientSecret("secret");
    return remoteTokenServices;
    }
  • stateless方法指定了当前资源是否仅仅允许token验证的方法进行校验,默认为true

4.3 auth2.0安全配置

@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/**").access("#oauth2.hasScope('all')")
.and()
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
}

该配置和下面的Web安全配置很像,但是不一样,这里仅仅对auth2.0的安全进行配置。这里的.antMatchers("/**").access("#oauth2.hasScope('all')")表示所有的请求携带的令牌都必须拥有all的授权范围,其中all授权范围必须和认证服务中的配置相一致。

4.4 Web安全配置

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf()
.disable()
.authorizeRequests()
.antMatchers("/r/r1").hasAuthority("p2")
.antMatchers("/r/r2").hasAuthority("p2")
.antMatchers("/**").authenticated()//所有的r/**请求必须认证通过
.anyRequest().permitAll();//其它所有请求都可以随意访问
}
}

4.5 暴露资源接口

@RestController
@Slf4j
public class OrderController { @GetMapping("/r1")
@PreAuthorize("hasAnyAuthority('p1')")
public String r1(){
return "访问资源r1";
}
}

由于4.4启用了prePostEnabled,所以这里可以使用@PreAuthorize注解对资源安全请求进行管理。

@PreAuthorize("hasAnyAuthority('p1')")表示请求者必须拥有p1权限,p1权限定义在auth-center服务表的t_permission表。

5. 接口测试

源代码地址:https://gitee.com/kdyzm/spring-security-oauth-study/tree/v3.0.0

5.1 准备工作

首先,阅读下 https://gitee.com/kdyzm/spring-security-oauth-study/tree/v3.0.0/auth-center 项目的自述文件,配置好数据库和表、配置文件,配置完成之后分别启动认证服务auth-center服务(端口号30000)和资源服务resource-server(端口号30001)。

5.2 获取token

阅读下 https://gitee.com/kdyzm/spring-security-oauth-study/tree/v3.0.0/auth-center 项目的自述文件,有四种获取token的方式。

5.3 请求资源服务

假设在5.2已经成功获取到了token:

{
"access_token": "11c5eaec-768f-400a-85e1-e2b52276b83d",
"token_type": "bearer",
"refresh_token": "34eb5d57-de7e-4f26-b35e-64162c64117e",
"expires_in": 7199,
"scope": "all"
}

接下来要携带着token请求资源服务:

header value
Authorization Bearer 0cc2da26-b634-4ccb-a8fe-14f454a13090

GET请求:http://127.0.0.1:30001/r1

请求成功,结果返回:

访问资源r1

请求失败,结果返回:

{
"error": "invalid_token",
"error_description": "0cc2da26-b634-4ccb-a8fe-14f454a13090"
}

5.4 请求演示

下面演示使用postman基于密码模式获取token并请求资源服务的过程:

6.源代码

源代码地址:https://gitee.com/kdyzm/spring-security-oauth-study/tree/v3.0.0

我的博客地址:https://blog.kdyzm.cn/

Spring Security OAuth2.0认证授权二:搭建资源服务的更多相关文章

  1. Spring Security OAuth2.0认证授权三:使用JWT令牌

    Spring Security OAuth2.0系列文章: Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二: ...

  2. Spring Security OAuth2.0认证授权四:分布式系统认证授权

    Spring Security OAuth2.0认证授权系列文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授 ...

  3. Spring Security OAuth2.0认证授权五:用户信息扩展到jwt

    历史文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二:搭建资源服务 Spring Security OA ...

  4. Spring Security OAuth2.0认证授权六:前后端分离下的登录授权

    历史文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二:搭建资源服务 Spring Security OA ...

  5. Spring Security OAuth2.0认证授权一:框架搭建和认证测试

    一.OAuth2.0介绍 OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不 需要将用户名和密码提供给第三方应用或分享他们数据的所有内容. 1.s ...

  6. Spring security OAuth2.0认证授权学习第四天(SpringBoot集成)

    基础的授权其实只有两行代码就不单独写一个篇章了; 这两行就是上一章demo的权限判断; 集成SpringBoot SpringBoot介绍 这个篇章主要是讲SpringSecurity的,Spring ...

  7. Spring security OAuth2.0认证授权学习第三天(认证流程)

    本来之前打算把第三天写基于Session认证授权的,但是后来视屏看完后感觉意义不大,而且内容简单,就不单独写成文章了; 简单说一下吧,就是通过Servlet的SessionApi 通过实现拦截器的前置 ...

  8. Spring security OAuth2.0认证授权学习第一天(基础概念-认证授权会话)

    这段时间没有学习,可能是因为最近工作比较忙,每天回来都晚上11点多了,但是还是要学习的,进过和我的领导确认,在当前公司的技术架构方面,将持续使用Spring security,暂不做Shiro的考虑, ...

  9. Spring security OAuth2.0认证授权学习第二天(基础概念-授权的数据模型)

    如何进行授权即如何对用户访问资源进行控制,首先需要学习授权相关的数据模型. 授权可简单理解为Who对What(which)进行How操作,包括如下: Who,即主体(Subject),主体一般是指用户 ...

随机推荐

  1. 测试与发布( Alpha版本 )

    THE BUG 团队 杨梓琦 温海源 李华 陈杰才 郑堡恩 钟明康 软件说明 本软件用MYSQL数据库保存所有的数据内容,因此可以通过查询数据库查询功能是否正常进行. 测试过程 在测试过程中,左右两张 ...

  2. WPF中DatePiker值绑定以及精简查询

    WPF中DatePiker值绑定以及精简查询 1.WPF中DatePiker值绑定 Xaml中值绑定使用Text <DatePicker Text="{Binding strMinDa ...

  3. CentOS 用户请关注,你期待的 CentOS Linux 9 再也不会来了

    2020年12月晚上红帽官网发布了一条公告,宣布了几件事情: 将不会发行 CentOS Linux 9 CentOS Linux 8 的更新支持持续到2021年12月31日 CentOS Linux ...

  4. 免费部署个人博客到远端GitHub

    前言 前面的博客我写到怎么样用hexo建立一个自己的博客网站(没看的可以先看前面那个文章地址,)但是它只能运行在本地端口,如果你分享给你的小伙伴他们是打不开的.如果把它部署到服务器上或空间上每个月都会 ...

  5. Python Windows开发环境搭建

    一.下载python安装包 python官网地址:https://www.python.org/,下载windows平台包并安装 二.在Windows设置环境变量 计算机右键,选择属性,在高级系统设置 ...

  6. MISC-吹着贝斯扫二维码

    题目 [安洵杯 2019]吹着贝斯扫二维码 解压附件,有36个文件和一个压缩包,压缩包带密码和备注 分析 文件类型 随便打开一个不明文件,是jpg图片啊(FF D8 FF) 改一个试试,有一个小块二维 ...

  7. MySQL增强半同步的搭建实验,和一些参数的个人理解

    关于参数理解,已补充实验,可以查看: rpl_semi_sync_master_wait_no_slave 参数研究实验 环境信息 role ip port hostname master 192.1 ...

  8. django 取出数据库的时间与当前时间相加减

    1 转换时区utc比北京时间慢八个小时 from datetime import tzinfo, timedelta, datetime ZERO = timedelta(0) class UTC(t ...

  9. gcc编译阶段打印宏定义的内容

    背景 总所周知,代码量稍微大一点的C/C++项目的一些宏定义都会比较复杂,有时候会嵌套多个#if/#else判断分支和一堆#ifdef/#undef让你单看代码的话很难判断出宏定义的具体内容. 如果有 ...

  10. 微服务痛点-基于Dubbo + Seata的分布式事务(AT)模式

    前言 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案. ...