springCloud 授权服务器
之前弄好了非常非常简单的限流,现在就是登陆进来的用户,我们需要对他进行认证。这个时候就要用到我们的授权服务器了。
什么是授权服务器,就是给客户端一个身份,一个token。让我们的服务器认识他。
springCloud是提供了这样的模块的oauth2,先上依赖
<!-- 服务发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId></dependency>
然后实现我们自己的授权服务配置类,需要继承AuthorizationServerConfigurerAdapter
这个类的资料网上都有,我这里照搬一下
AuthorizationServerConfigurer是配置OAUth2 授权服务器的配置类接口,添加了@EnableAuthorizationServer,spring会自动注入。接口有三个方法,可以实现客户端配置、安全功能、以及各个Endpoint(端点)的相关配置
public class AuthorizationServerConfigurerAdapter implements AuthorizationServerConfigurer {@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {}@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {}@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {}}
根据入参的名称,我们可以知道,这三个方法对应的功能
AuthorizationServerSecurityConfigurer 配置安全功能
ClientDetailsServiceConfigurer 配置我们客户端的信息
AuthorizationServerEndpointsConfigurer 配置我们端点的各个功能。
Spring Security OAuth2 是有默认的配置类的OAuth2AuthorizationServerConfiguration,当我们没有自己定义配置类时,是获取这个配置信息。这里不贴代码了
我们自己实现了配置类,重写configure(ClientDetailsServiceConfigurer clients),模拟一个客户端,
/*** 添加第三方的客户端*/@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {clients.inMemory().withClient("api") //第三方客户端的名称.secret(passwordEncoder.encode("secret")) //第三方客户端的密钥.scopes("all") //第三方客户端的授权范围.accessTokenValiditySeconds(3600) //获取token的有效期.refreshTokenValiditySeconds(7*3600); //refresh_token的有效期super.configure(clients);}
重写configure(AuthorizationServerEndpointsConfigurer endpoints),因为我们主要的是想看看一个token的生成以及相应的认证
/*** 配置验证管理器,UserDetailService*/@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.authenticationManager(authenticationManager).userDetailsService(userDetailsService).tokenStore(jwtTokenStore()).tokenEnhancer(jwtAccessTokenConverter());//.tokenStore(redisTokenStore());super.configure(endpoints);}
我们来解析一下都做了什么事
// Security 设置我们的认证管理器authenticationManager,需要我们定义一个管理器对象endpoints.authenticationManager(authenticationManager)
// 重写我们的userDetailsService,后面我们可以自己模拟用户,也可以通过数据库查询我们的用户信息
.userDetailsService(userDetailsService)
//令牌的存储服务,使用JWT来为我们存储token,主要是为了把我们用户信息以及认证信息都放在token里,这样就不用一直请求我们认证服务器来获取用户的信息,减少授权服务器压力
.tokenStore(jwtTokenStore())
private TokenStore jwtTokenStore() {JwtTokenStore jwtTokenStore = new JwtTokenStore(jwtAccessTokenConverter());return jwtTokenStore;}private JwtAccessTokenConverter jwtAccessTokenConverter() {JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();//加载私钥ClassPathResource classPathResource = new ClassPathResource("test.jks");KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(classPathResource,"test".toCharArray());jwtAccessTokenConverter.setKeyPair(keyStoreKeyFactory.getKeyPair("test","test".toCharArray()));return jwtAccessTokenConverter;}
额,还是先捋一捋用JWT(Json Web Token)能干啥
我们可以用公钥和私钥来加密我们的用户信息,使用Keytool来生成我们密钥对
keytool -genkeypair -alias test-keyalg RSA -keypass test
-keystore test.jks -validity 365 -storepass test
完了把我们生成好的文件放在我们的res下
//我们的token增强就是使用我们JwtAccessTokenConverter
.tokenEnhancer(jwtAccessTokenConverter());
我们的token就生成好了。
不过,我们漏掉了两个东西,先上代码
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable();http.authorizeRequests().anyRequest().authenticated();//super.configure(http);}@Beanpublic AuthenticationManager authenticationManager() throws Exception {return super.authenticationManager();}@Beanpublic UserDetailsService userDetailsService(){InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();User user = new User("admin","123456", Arrays.asList(new SimpleGrantedAuthority("Role_Admin")));inMemoryUserDetailsManager.createUser(user);return inMemoryUserDetailsManager;}@Beanpublic PasswordEncoder passwordEncoder(){return NoOpPasswordEncoder.getInstance();}
}
这个适配器帮我们定义了
AuthenticationManager,
UserDetailsService,
PasswordEncoder的策略,我们现在是模拟了一个用户出来,后续可以通过查数据库来重写UserDetailsService,认证管理器以及验证管理器先不设置了
springCloud 授权服务器相关推荐
- 使用Spring Security Oauth2 和 JWT保护微服务--Uaa授权服务器的编写
学习自深入理解微服务 采用Spring Security OAuth2 和 JWT的方式,Uaa服务只需要验证一次,返回JWT.返回的JWT包含了用户的所有信息,包括权限信息 从三个方面讲解: JWT ...
- Spring Security 中使用Keycloak作为认证授权服务器
Keycloak对流行的Java应用提供了适配器.在系列文章的上一篇我们演示了针对Spring Boot的安全保护,用的就是适配器的一种.Keycloak同样提供Spring Security的适配器 ...
- JetBrains 授权服务器(License Server URLS):
使用方法:激活时选择License server 填入http://idea.higherbros.com 点击Active即可. how-to-active: when active,type th ...
- 【转】idea激活搭建授权服务器
1.下载软件:磁力链接: magnet:?xt=urn:btih:2289E4F8CEB346AC44E54C8C0DA706CC537301AA 复制磁力链接地址 magnet:?xt=urn:b ...
- 从壹开始 [ Id4 ] 之一║ 授权服务器 IdentityServer4 开篇讲计划书
哈喽大家周四好!时间过的很快,现在已经是三月份了,我的 IdentityServer4 教程也拖了一定的时间了,正好最近有精力学新东西了,主要中间被小伙伴要求写一个管理后台,目前1.0已经上线(< ...
- uaa 授权_使用UAA OAuth2授权服务器–客户端和资源
uaa 授权 在上一篇文章中,我介绍了如何使用Cloud Foundry UAA项目启动OAuth2授权服务器,以及如何使用OAuth2授权代码流程中涉及的一些参与者来填充它. 我在Digital O ...
- 使用UAA OAuth2授权服务器–客户端和资源
在上一篇文章中,我介绍了如何使用Cloud Foundry UAA项目启动OAuth2授权服务器,以及如何使用OAuth2授权代码流程中涉及的一些参与者来填充它. 我已经在Digital Ocean网 ...
- 为Windows Server 2012 R2指定授权服务器
为Windows Server 2012 R2指定授权服务器 在Windows Server 2008 R2的终端服务中,可以手动指定授权服务器,而在Windows Server 2012 R2中,默 ...
- 芋道 spring security oauth2 入门_Spring官方宣布:新的Spring OAuth2.0授权服务器已经来了
1. 前言 记不记得之前发过一篇文章Spring 官方发起Spring Authorization Server 项目.该项目是由Spring Security主导的一个社区驱动的.独立的孵化项目.由 ...
最新文章
- 软件测试女孩学适合吗
- Android更改浮动操作按钮颜色
- STM32 基础系列教程 35 - Lwip_sntp
- 抚州虚拟服务器,南通虚拟主机_南通云虚机_南通主机申请_南通网站空间_爱名网(www.22.cn)...
- 报名 | 腾讯组织的区块链技术沙龙,本周六在深圳!
- BSOJ 2423 -- 【PA2014】Final Zarowki
- Spatial Transformer Networks(STN)
- 祝贺JeecgBoot获评为2019年度最受欢迎中国开源软件
- SpringBoot面试题及答案整理
- Spring3集成Swagger2遇到问题总结
- 【FFMPEG系列】windows下编译ffmpeg且加入libx264
- BZOJ 1019: [SHOI2008]汉诺塔( dp )
- 如何判断一个三位数是否为水仙花数
- JavaWeb笔记——JSPThymeleaf
- python语言应用 智慧树满分章节测试答案_Python语言应用完整智慧树网课章节测试答案...
- 计算机学院新生入学致辞,计算机学院召开2020级新生入学教育启动大会
- android 小米手机播放短小音频无声音问题
- 剑指offer | 面试题54:二叉搜索树的第k大节点
- 微信群抽奖,有什么好用的抽奖小程序?
- 计算机电脑照片大小,电脑上怎么调整照片kb
热门文章
- 棋牌游戏开发不可缺少的四大技术支持
- 离散数学-图的运算与基本概念、导出子图、路与连通
- [Python图像识别] 四十七.Keras深度学习构建CNN识别阿拉伯手写文字图像
- webpack5 css打包压缩
- wildcard java_java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询
- Linux 网络设置(ifconfig、route、traceroute、netstat、ss、nslookup、dig、ping状态返回分析)
- C++ primer Plus(第六版)中文版第九章第3题
- ICTCLAS的JNI调用接口说明
- 微信java版_JAVA版微信支付V3-完全版
- 什么样的面试更有效?