内容简介:最近在学习微服务相关的知识及各种框架的使用,在搭建的过程中,遇到了不少问题,但是都没有记录下来,导致过一段时间后,就没有什么印象了.. 所以决定在掘金写文章。 一是为了记录自己在写代码过程中的知识点以及解决的问题,方便查阅; 二是为了能与其它朋友一起讨论,可以吸收不同思想及不同方案,扩展思路。标题之所以为在写的过程中,遇到自己不熟悉或没有把握的概念及知识,会谨慎的求证。也会尽量保证发布的任何代码都是可运行的。 但是由于自己技术能力有限,难免会有错误,包括但不限于
最近在学习微服务相关的知识及各种框架的使用,在搭建的过程中,遇到了不少问题,但是都没有记录下来,导致过一段时间后,就没有什么印象了.. 所以决定在掘金写文章。 一是为了记录自己在写代码过程中的知识点以及解决的问题,方便查阅; 二是为了能与其它朋友一起讨论,可以吸收不同思想及不同方案,扩展思路。
标题之所以为 Spring Cloud Security
,是因为想要写 Spring Cloud
相关的一系列技术。而 Spring Cloud
依赖 Springboot
, security
还是 Spring Security
模块的东西,本质上没有太大的区别。
在写的过程中,遇到自己不熟悉或没有把握的概念及知识,会谨慎的求证。也会尽量保证发布的任何代码都是可运行的。 但是由于自己技术能力有限,难免会有错误,包括但不限于 拼写错误
、 代码错误
、 有代码洁癖的人看着缩进不舒服
、 概念理解有偏差
、 代码不够优雅
等等,希望各位可以不吝指教,不喜勿喷~
知识储备
新建 microservice
,作为所有服务的 parent
, 同时引入依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <spring.cloud.dependencies.version>Greenwich.RELEASE</spring.cloud.dependencies.version> <spring-security-oauth2-autoconfigure.version>2.1.5.RELEASE</spring-security-oauth2-autoconfigure.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring.cloud.dependencies.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> <version>${spring-security-oauth2-autoconfigure.version}</version> </dependency> </dependencies> </dependencyManagement> 复制代码
新建 uaa-service
,作为认证授权服务,引入依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> <exclusions> <exclusion> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> <version>2.1.5.RELEASE</version> </dependency> </dependencies> 复制代码
spring-cloud-starter-oauth2
这个依赖应该已经包含了 spring security
相关的 jar
,但是 spring-cloud-dependencies
版本为 Greenwich.RELEASE
时, spring-security-oauth2-autoconfigure
子module中引入的版本一直是 2.1.0.M4
,不管是重新import还是删除本地 maven repository
都不管用, 在官方的 issue
中也有人遇到的相同的问题 , 所以以上依赖暂时使用单独引入 spring-security-oauth2-autoconfigure
, version
还必须在子module中指定,不知你们是否也碰到这种问题.
Authorization Server 配置
@Configuration @EnableAuthorizationServer public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Autowired private PasswordEncoder passwordEncoder; @Override public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { super.configure(security); } @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("client-id") .secret(passwordEncoder.encode("client-secret")) .scopes("read", "write") .authorizedGrantTypes("password", "refresh_token") .authorities("user:view"); } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints .authenticationManager(authenticationManager) .tokenStore(tokenStore()); } @Bean public TokenStore tokenStore() { return new InMemoryTokenStore(); } } 复制代码
- 使用
@EnableAuthorizationServer
注解告诉Spring
激活authorization server - 同时
@Configuration
注解的实现了AuthorizationServerConfigurer
接口的类表明这是一个authorization server配置类。 - 这里使用的
AuthorizationServerConfigurerAdapter
是Spring
提供的默认实现AuthorizationServerConfigurer
接口的类,里面都是空方法 - 注入
authenticationManager
,这是Spring
默认提供的, 如果需要使用password
模式,必须显示地配置endpoints.authenticationManager(authenticationManager)
- 一般项目中密码之类的字段都不会使用明文加密, 所以这里注入
passwordEncoder
,用于用户登录时密码校验以及创建用户时密码的加密 -
tokenStore
这里暂时使用InMemoryTokenStore
,Spring
同时也提供了如下几种存储token
方式 -
ClientDetailsServiceConfigurer
是配置authorization server颁发的client的凭证-
client.inMemory()
是在内存中存储client信息 -
withClient
和secret
是client的username
和password
-
scopes
是授权范围,例如该client可以进行读和写 -
authorizedGrantTypes
是配置授权方式, 可以是OAuth2.0
中支持的方式,也可以是自定义的
-
配置用户
@Configuration @EnableGlobalMethodSecurity(proxyTargetClass = true, prePostEnabled = true) public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("admin") .password(passwordEncoder().encode("password")) .roles("ADMIN"); } @Bean public BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } } 复制代码
-
@EnableGlobalMethodSecurity(proxyTargetClass = true, prePostEnabled = true)
开启方法级别权限验证 -
AuthenticationManagerBuilder
在内存中配置一个用户,用于password
模式获取token
-
BCryptPasswordEncoder
配置加密实现类
获取token
以上项目启动完成之后,启动项目, spring security
会为我们提供几个 endpoint
, 其中一个就是获取token的: /oauth/token
。使用的http请求 工具 是 postman
如上图所示,输入之后,会把之前配置的 client
的 username
和 password
的 base64
编码放在 http header
中
在 http body
中输入
发送请求之后,得到响应, 其中的 access_token
就是我们后续请求接口使用的令牌
总结
以上就是利用 spring security
简单地搭建authorization server, 可以看到还是蛮方便的。但是如果是用在生产环境,还远不够,例如用户信息、client信息、token信息的持久化,各种异常的处理,资源服务器的配置等等,在后续的文章也会不断的完善,感谢!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- kafka入门+集群搭建
- vue入门(一):项目搭建
- django入门一(搭建开发环境)
- MongoDB分片群集搭建入门详解
- webpack入门(2) - 安装,配置,环境搭建
- Seata 搭建与分布式事务入门
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
perl进阶
Randal L.Schwartz、brian d.foy、Tom Phoenix / 韩雷 / 人民邮电出版社 / 2015-10-1 / 69
本书是Learning Perl一书的进阶。学完本书之后,您可以使用Perl语言的特性编写从简单脚本到大型程序在内的所有程序,正是Perl语言的这些特性使其成为通用的编程语言。本书为读者深入介绍了模块、复杂的数据结构以及面向对象编程等知识。 本书每章的篇幅都短小精悍,读者可以在一到两个小时内读完,每章末尾的练习有助于您巩固在本章所学的知识。如果您已掌握了Learning Perl中的内容并渴......一起来看看 《perl进阶》 这本书的介绍吧!