之前弄好了非常非常简单的限流,现在就是登陆进来的用户,我们需要对他进行认证。这个时候就要用到我们的授权服务器了。

什么是授权服务器,就是给客户端一个身份,一个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 授权服务器相关推荐

  1. 使用Spring Security Oauth2 和 JWT保护微服务--Uaa授权服务器的编写

    学习自深入理解微服务 采用Spring Security OAuth2 和 JWT的方式,Uaa服务只需要验证一次,返回JWT.返回的JWT包含了用户的所有信息,包括权限信息 从三个方面讲解: JWT ...

  2. Spring Security 中使用Keycloak作为认证授权服务器

    Keycloak对流行的Java应用提供了适配器.在系列文章的上一篇我们演示了针对Spring Boot的安全保护,用的就是适配器的一种.Keycloak同样提供Spring Security的适配器 ...

  3. JetBrains 授权服务器(License Server URLS):

    使用方法:激活时选择License server 填入http://idea.higherbros.com 点击Active即可. how-to-active: when active,type th ...

  4. 【转】idea激活搭建授权服务器

    1.下载软件:磁力链接: magnet:?xt=urn:btih:2289E4F8CEB346AC44E54C8C0DA706CC537301AA 复制磁力链接地址  magnet:?xt=urn:b ...

  5. 从壹开始 [ Id4 ] 之一║ 授权服务器 IdentityServer4 开篇讲计划书

    哈喽大家周四好!时间过的很快,现在已经是三月份了,我的 IdentityServer4 教程也拖了一定的时间了,正好最近有精力学新东西了,主要中间被小伙伴要求写一个管理后台,目前1.0已经上线(< ...

  6. uaa 授权_使用UAA OAuth2授权服务器–客户端和资源

    uaa 授权 在上一篇文章中,我介绍了如何使用Cloud Foundry UAA项目启动OAuth2授权服务器,以及如何使用OAuth2授权代码流程中涉及的一些参与者来填充它. 我在Digital O ...

  7. 使用UAA OAuth2授权服务器–客户端和资源

    在上一篇文章中,我介绍了如何使用Cloud Foundry UAA项目启动OAuth2授权服务器,以及如何使用OAuth2授权代码流程中涉及的一些参与者来填充它. 我已经在Digital Ocean网 ...

  8. 为Windows Server 2012 R2指定授权服务器

    为Windows Server 2012 R2指定授权服务器 在Windows Server 2008 R2的终端服务中,可以手动指定授权服务器,而在Windows Server 2012 R2中,默 ...

  9. 芋道 spring security oauth2 入门_Spring官方宣布:新的Spring OAuth2.0授权服务器已经来了

    1. 前言 记不记得之前发过一篇文章Spring 官方发起Spring Authorization Server 项目.该项目是由Spring Security主导的一个社区驱动的.独立的孵化项目.由 ...

最新文章

  1. 软件测试女孩学适合吗
  2. Android更改浮动操作按钮颜色
  3. STM32 基础系列教程 35 - Lwip_sntp
  4. 抚州虚拟服务器,南通虚拟主机_南通云虚机_南通主机申请_南通网站空间_爱名网(www.22.cn)...
  5. 报名 | 腾讯组织的区块链技术沙龙,本周六在深圳!
  6. BSOJ 2423 -- 【PA2014】Final Zarowki
  7. Spatial Transformer Networks(STN)
  8. 祝贺JeecgBoot获评为2019年度最受欢迎中国开源软件
  9. SpringBoot面试题及答案整理
  10. Spring3集成Swagger2遇到问题总结
  11. 【FFMPEG系列】windows下编译ffmpeg且加入libx264
  12. BZOJ 1019: [SHOI2008]汉诺塔( dp )
  13. 如何判断一个三位数是否为水仙花数
  14. JavaWeb笔记——JSPThymeleaf
  15. python语言应用 智慧树满分章节测试答案_Python语言应用完整智慧树网课章节测试答案...
  16. 计算机学院新生入学致辞,计算机学院召开2020级新生入学教育启动大会
  17. android 小米手机播放短小音频无声音问题
  18. 剑指offer | 面试题54:二叉搜索树的第k大节点
  19. 微信群抽奖,有什么好用的抽奖小程序?
  20. 计算机电脑照片大小,电脑上怎么调整照片kb

热门文章

  1. 棋牌游戏开发不可缺少的四大技术支持
  2. 离散数学-图的运算与基本概念、导出子图、路与连通
  3. [Python图像识别] 四十七.Keras深度学习构建CNN识别阿拉伯手写文字图像
  4. webpack5 css打包压缩
  5. wildcard java_java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询
  6. Linux 网络设置(ifconfig、route、traceroute、netstat、ss、nslookup、dig、ping状态返回分析)
  7. C++ primer Plus(第六版)中文版第九章第3题
  8. ICTCLAS的JNI调用接口说明
  9. 微信java版_JAVA版微信支付V3-完全版
  10. 什么样的面试更有效?