java oauth2 例子_使用SpringSecurityOAuth2默认实现OAuth2授权示例

本文记录一下使用SpringSecurityOAuth2实现授权的步骤。

1、相关知识

2、构建项目

本文使用的springboot版本是2.0.4.RELEASE,不同版本可能会有所区别。下面是主要的配置文件和类:

1)pom依赖

org.springframework.boot

spring-boot-starter-security

org.springframework.security.oauth.boot

spring-security-oauth2-autoconfigure

2.1.3.RELEASE

2)application.properties

security.oauth2.client.client-id =MyProject

security.oauth2.client.client-secret =MyProject_123

security.oauth2.client.registered-redirect-uri = www.baidu.com

指定应用的ID和秘钥,redirect-uri暂时没用到,但必须有,否则无法演示授权效果。

3)主配置类

@EnableWebSecurity

@Configurationpublic class WebSecurityConfig extendsWebSecurityConfigurerAdapter{

@Overrideprotected void configure(HttpSecurity http) throwsException {

http.httpBasic().and().csrf().disable();

}

@BeanpublicPasswordEncoder passwordEncoder() {return newBCryptPasswordEncoder();

}

}

4)用户认证类

@Componentpublic class MyUserDetailsService implementsUserDetailsService{

@AutowiredprivatePasswordEncoder passwordEncoder;

@Overridepublic UserDetails loadUserByUsername(String username) throwsUsernameNotFoundException {

System.out.println("登录用户名:"+username);

String password= passwordEncoder.encode("123456");return new User(username,password,true,true,true,true,

AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER"));

}

}

5)认证服务器类

@Configuration

@EnableAuthorizationServerpublic classAuthorizationServerConfig {

}

6)启动类

@SpringBootApplicationpublic classApp {public static voidmain(String[] args) {

SpringApplication.run(App.class, args);

}

}

3、OAuth 2.0协议相关参数讲解

5bb658b5ac62b4fcb1f9d43309f21f94.png

1)授权码模式下,请求授权码所需参数:

response_type:------必填,值是固定的常量code

client_id:-------------必填,值是应用ID,配置文件中定义的MyProject

redirect_uri:---------非必填,值是回调地址

scope:----------------非必填,值是范围

state:-----------------非必填,值是状态

2)授权码模式下,请求Token所需参数:

grant_type:---------必填,值是固定的常量authorization_code

code:----------------必填,值是上面一步请求返回的授权码

redirect_uri:--------必填,值是回调地址

client_id:------------必填,值是应用ID,配置文件中定义的MyProject

3)密码模式下,请求Token所需参数:

grant_type:---------必填,值是固定的常量password

username:----------必填,值是用户名

password:-----------必填,值是用户密码

scope:---------------非必填,范围

4、演示OAuth2授权

启动项目,使用Restlet Client-REST API Testing插件测试

1)测试授权码模式

弹出认证页面,输入用户名密码,用户名随意,密码是123456,参考MyUserDetailsService.java。

17ab187cc8c781eb79cb4e22e52f5e60.png

认证成功后,跳转到授权页面。

0af7a8cbf47d021cddffe4f8aedde3b5.png

选择同意授权,跳转到配置的回调url,浏览器中显示:https://www.baidu.com/?code=Q52K1I。其中Q52K1I就是获取的授权码。

使用插件发送POST请求,获取Token

5a9f502b6ade1cf4e28bd3a2ff3d66cb.png

80d934b12636cf2882e5c7ec99edf767.png

2)测试密码模式

e98d0b5542ccf282eeaa125816991a6a.png

f4ecbc8a1585b0619f72ff0ed7fb523d.png

说明:

1)可以看到两种方式获取的Token是一样的,因为同一个用户在系统中已经存在Token了,就不会再创建,直接返回。

2)HEADERS第一个参数Authorization,点击Add authorization创建,弹出如下框,用户名、密码分别是应用的ID和秘钥。

485a2054f3dce7087a4f40f431fcd6a8.png

3)HEADERS第二个参数Content-Type,值为application/x-www-form-urlencoded,创建body参数时自动生成的。

5、演示获取资源

1)新增资源服务类

@Configuration

@EnableResourceServerpublic classResourceServerConfig {

}

2)新增测试类

@RestControllerpublic classUserController {

@GetMapping("/currentUser")publicObject getCurrentUser(@AuthenticationPrincipal UserDetails user) {returnuser;

}

}

3)启动服务,用密码模式获取Token,如上。

928bcb3f54dcfb23ebc809ec324d0bb6.png

4)访问资源,获取当前用户信息

db37c73ae7d73a387d2a7dab6be7db77.png

686323b72878d1ed0ac1ba1c6a777872.png

注意:参数名是Authorization,参数值是bearer e9c07170-fb16-4c20-a4cb-71fd623ccffb(token_type + access_token)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值