赞
踩
本文是梳理整合SpringCloud和SpringSecurity OAuth2的搭建流程!好久没撸SpringSecurity OAuth2这系列代码了,都快忘了,特写此文章梳理脉络!开干!!!
微服务版本
<spring-boot.version>2.3.2.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR9</spring-cloud.version> <spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version> <!-- spring cloud alibaba 依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- spring cloud 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency>
SpringSecurity OAuth2版本
<!--安全模块-->
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
</dependency>
通过微服务版本限定后spring-security-oauth2-autoconfigure的最终版本自动适配为2.1.2
刚开始我这里就不一次性把一大堆配置放上来,需要什么就写什么,不然到时候都搞不清那个配置是干嘛,有什么用的!这也是我写这个文章的缘由!
授权服核心配置-AuthorizationServerConfig
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
}
SpringSecurity核心配置
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
}
启动服务器-访问测试
访问http://localhost:3000/oauth/authorize?response_type=code&client_id=tao&redirect_uri=http://baidu.com&scope=all
任意输入账号密码试试
这是因为我们啥也没配置!
配置密码加密
WebSecurityConfig中
@Bean
public PasswordEncoder passwordEncoder() {//密码加密
return new BCryptPasswordEncoder();
}
配置登录用户账号密码
WebSecurityConfig中
@Autowired
public void globalUserDetails(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder().encode("123456")).roles("USER","ADMIN").authorities(AuthorityUtils.commaSeparatedStringToAuthorityList("p1,p2"));
//这里配置全局用户信息
}
授权服配置端点信息
AuthorizationServerConfig
@Autowired PasswordEncoder passwordEncoder; @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { //基于内存便于测试 clients.inMemory()// 使用in-memory存储 .withClient("tao")// client_id //.secret("secret")//未加密 .secret(passwordEncoder.encode("secret"))//加密 //.resourceIds("res1")//资源列表 .authorizedGrantTypes("authorization_code", "password", "client_credentials", "implicit", "refresh_token")// 该client允许的授权类型authorization_code,password,refresh_token,implicit,client_credentials .scopes("all", "ROLE_ADMIN", "ROLE_USER")// 允许的授权范围 //.autoApprove(false)//false跳转到授权页面 //加上验证回调地址 .redirectUris("http://baidu.com"); }
重启服务测试
http://localhost:3000/oauth/authorizeresponse_type=code&client_id=tao&redirect_uri=http://baidu.com&scope=all
登录成功得到授权码
授权码获取token
这里授权码就基本搞定了!接下来我们试试密码模式
Unsupported grant type: password
,默认不支持密码模式,需要而外配置下!
配置认证管理器-AuthenticationManager
WebSecurityConfig中
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
授权服配置密码模式
AuthorizationServerConfig
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {//配置令牌的访问端点和令牌服务
endpoints
.authenticationManager(authenticationManager)//认证管理器
;
}
重启访问测试
成功!
这个就简单了,token直接是显示在地址栏上的http://localhost:3000/oauth/authorize?client_id=tao&response_type=token&scope=all&redirect_uri=http://baidu.com
客户端模式这里就不演示了,实际上用的并不多!那么到这里,授权基本上的就搞定了,至于其他配置下文会深入,这里我们既然得到了Token那么我们就可以测试一下认证!
创建测试资源
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。