Security+JWT搭建简单的授权服务器和资源服务器

之前有两篇博客分别将来介绍了 OAuth 2.0JWT

1、OAuth 2.0详解

2、SpringSceurity(6)---JWT详解

这边通过Security+JWT搭建简单的授权服务器和资源服务器示例。

整体流程大概是这样的

JWT 认证流程

1、用户先访问授权服务器。传入用户输入用户名/密码登录,授权服务器认证成功后,会返回给客户端一个 JWT
2、用户在访问资源服务器。当用户希望访问一个受保护的路由或者资源的时候,需要请求头的 Authorization 字段中使用Bearer 模式添加 JWT,其内容看起来是下面这样
Authorization: Bearer复制代码
3、资源服务器保护路由将会检查请求头 Authorization 中的 JWT 信息,如果合法,则允许用户的行为

下面开始搭建

一、搭建授权服务器

授权服务器配置类

/**
* @Description: 授权服务器配置
* 使用 @EnableAuthorizationServer 来配置授权服务机制,并继承 AuthorizationServerConfigurerAdapter 该类重写 configure 方法定义授权服务器策略
*/
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter { @Autowired
private AuthenticationManager authenticationManager; /**
* 使用同一个密钥来编码 JWT 中的 OAuth2 令牌,在资源服务器解析JWT的时候需要有一样的密钥
*/
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("dada");
return converter;
} @Bean
public JwtTokenStore jwtTokenStore() {
return new JwtTokenStore(accessTokenConverter());
} /**
* 告诉Spring Security Token的生成方式
*/
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.authenticationManager(authenticationManager)
.tokenStore(jwtTokenStore())
.accessTokenConverter(accessTokenConverter());
} @Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
//添加客户端信息 使用in-memory存储客户端信息
clients.inMemory()
//客户端标识 ID
.withClient("clientId")
//客户密钥
.secret("666666")
//客户端访问范围,默认为空则拥有全部范围
.scopes("read_userinfo")
//客户端使用的授权类型,默认为空
.authorizedGrantTypes(
"password",
"authorization_code",
"refresh_token");
}
}

application.properties配置类

security.user.name=xuxiaoxiao
security.user.password=123456

这里设置 用户名为: xuxiaoxiao 密码为: 123456 端口号默认为: 8080

说明 有关其它代码这里就不再贴出,最后会给出整个demo的github地址。

二、搭建资源服务器

资源服务器配置类

/**
* @Description: 资源服务器通过 @EnableResourceServer 注解来开启一个 OAuth2AuthenticationProcessingFilter 类型的过滤器
* 通过继承 ResourceServerConfigurerAdapter 类来配置资源服务器
*/
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated().and()
.requestMatchers().antMatchers("/api/**");
} @Bean
public TokenStore tokenStore() {
return new JwtTokenStore(jwtAccessTokenConverter());
} /**
* 与授权服务器使用共同的密钥进行解析
*/
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("dada");
return converter;
}
}

UserController

@Controller
public class UserController { @RequestMapping("/api/userinfo")
public ResponseEntity<String> getUerInfo() {
//这里会做解析jwt操作,获取jwt中的用户名
String username = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return ResponseEntity.ok(username);
} }

application.properties

server.port=8081

这里只是配置端口号为 8081

三、测试

1、整体测试流程

1.)启动jwt-authserver(授权服务器),端口8080

2.) 启动jwt-resourceserver(资源服务器),端口8081

3.) 请求授权服务器,获取jwt令牌

curl -X POST --user clientId:666666 http://localhost:8080/oauth/token -H "accept: application/json" -H "content-type: application/x-www-formurlencoded"
-d "grant_type=password&username=xuxiaoxiao&password=123456&scope=read_userinfo"

4.) 带上jwt令牌请求资源服务器

curl -X GET http://localhost:8081/api/userinfo -H "authorization: Bearer 上面返回的jwt令牌

2、postman测试

先请求授权服务器

从请求中可以看出,授权服务器已经成功返回 access_token

再请求资源服务器

因为上面授权服务器已经返回access_token,那么我们在请求资源服务器的时候,就可以在请求头中加入这个token。

可以看出资源服务器已经成功解析这个access_token,获取到当前用户名。

总结:这个demo实现了基于Security+JWT搭建简单的授权服务器和资源服务器,也仅仅是搭建了简单的demo。里面的数据都是写死的并没有通过配置走,对于配置类也没有做详细的说明。

Github地址 : 基于Security+JWT搭建简单的授权服务器和资源服务器

参考

1、授权服务器支持 JWT 令牌 (杨波)

2、oauth2-demo(demo更加完整)

3、Spring Security 与 OAuth2

别人骂我胖,我会生气,因为我心里承认了我胖。别人说我矮,我就会觉得好笑,因为我心里知道我不可能矮。这就是我们为什么会对别人的攻击生气。
攻我盾者,乃我内心之矛(25)

SpringSecurity(7)--- Security+JWT搭建简单的授权服务器和资源服务器的更多相关文章

  1. Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端

    Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端 目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Se ...

  2. SimpleSSO:使用Microsoft.Owin.Security.OAuth搭建OAuth2.0授权服务端

    目录 前言 OAuth2.0简介 授权模式 (SimpleSSO示例) 使用Microsoft.Owin.Security.SimpleSSO模拟OpenID认证 通过authorization co ...

  3. Spring Security OAuth2 Demo —— 隐式授权模式(Implicit)

    本文可以转载,但请注明出处https://www.cnblogs.com/hellxz/p/oauth2_impilit_pattern.html 写在前面 在文章OAuth 2.0 概念及授权流程梳 ...

  4. 使用Spring Security OAuth2进行简单的单点登录

    1.概述 在本教程中,我们将讨论如何使用Spring Security OAuth和Spring Boot实现SSO - 单点登录. 我们将使用三个单独的应用程序: 授权服务器 - 这是中央身份验证机 ...

  5. 初始nginx(启动运行) 使用nginx做一个简单的静态资源服务器

    第一次接触nginx的时候,那时候公司还是用的一些不知名的小技术,后来公司发展问题,重新招了人,然后接触到nginx,公司 使用nginx用来做代理服务器,所有请求 都先经过nginx服务器,然后交由 ...

  6. Spring Security Oauth2 使用 token 访问资源服务器出现异常:Invalid token does not contain resource id (oauth2)

    异常如图 查看资源服务器的日志 p.a.OAuth2AuthenticationProcessingFilter : Authentication request failed: error=&quo ...

  7. Spring security oauth2最简单入门环境搭建

    关于OAuth2的一些简介,见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS:貌似内容太水直接被鹳狸猿干沉.. 友情提示 学习曲线:spring+s ...

  8. spring security oauth2搭建resource-server demo及token改造成JWT令牌

    我们在上文讲了如何在spring security的环境中搭建基于oauth2协议的认证中心demo:https://www.cnblogs.com/process-h/p/15688971.html ...

  9. .NetCore WebApi——基于JWT的简单身份认证与授权(Swagger)

    上接:.NetCore WebApi——Swagger简单配置 任何项目都有权限这一关键部分.比如我们有许多接口.有的接口允许任何人访问,另有一些接口需要认证身份之后才可以访问:以保证重要数据不会泄露 ...

  10. 使用Spring Cloud Security OAuth2搭建授权服务

    阅读数:84139 前言: 本文意在抛砖引玉,帮大家将基本的环境搭起来,具体实战方案还要根据自己的业务需求进行制定.我们最终没有使用Spring Security OAuth2来搭建授权服务,而是完全 ...

随机推荐

  1. 【Python】一篇拿下类属性与类方法详解【超详细的注释和解释】

    文章目录 前言 类的实例化 类的非静态属性或方法(实例属性和方法) 类的静态属性和方法 静态属性(静态成员变量) 静态方法 类方法(静态成员函数) 总结 属性的访问权限 尾声 前言 先赞后看好习惯 打 ...

  2. 【链表】链表的合并【经典面试OJ详解】【力扣21,力扣23】超详细的算法教程

    链表的合并 导航小助手 说在前面 题目链接 链表结构 OJ21.合并两个有序链表 题目描述和算法分析 接口的完整实现代码 OJ23.合并K个升序链表 题目描述和算法分析 接口的完整实现代码 尾声 说在 ...

  3. (C语言)关于printf的新发现: 可以用字符串变量替代第一个字符串参数

    char a[] = "hello%d\n%dworld"; printf(a, 2, 3); //输出: //hello2 //2world 事情的起因是使用printf(&qu ...

  4. 大数据生态组件WEB UI地址汇总

    (1) Hadoop Web UI http://master-1:50070/dfshealth.html#tab-overview (2) YARN应用Web UI http://master-1 ...

  5. Linux--top命令解释

    top命令解释 1.1 系统运行时间和平均负载: top命令的顶部显示与uptime命令相似的输出 这些字段显示: 当前时间 系统已运行的时间 当前登录用户的数量 相应最近5.10和15分钟内的平均负 ...

  6. jq 实现select 下拉框的联动效果

    实现联动的代码 $(document).ready(function() { $("#selectone").bind("change",function(){ ...

  7. U盘安装win7提示缺少所需的CD/DVD驱动器设备驱动程序

    问题: 最近使用U盘启动盘安装win7,系统弹出提示框: 解决方法: U盘别插在usb3.0的口(蓝色),换成一个usb2.0的口就可以了

  8. VS2019 配置 Qt 库

    如标题所说,在 VS 编译器中调用 Qt 库 首先安装一个适合 VS 的 Qt  版本 不知道怎么安装的,可以参考:Visual Studio+Qt配置开发环境 Qt 安装之后,需要在 VS 编译器中 ...

  9. 【Docker】使用 Docker 部署 .Net Core 项目 (四)

    系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...

  10. 【Python OO其二】设计模式之工厂模式(举例说明)

    工厂模式 工厂模式中的"工厂"实际上就是把类看成制造某种模板的工具(工厂),由这个类生成的实例除了本身自有的属性外,还可以通过指定的方式产出具有不同属性的同一类实例 比如:有一个面 ...