# Experiment04
**Repository Path**: amenotatsu/Experiment04
## Basic Information
- **Project Name**: Experiment04
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-05-18
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#
东莞理工学院网络空间安全学院
#### 课程名称:企业级开发框架专题 学期:2020春季
| 实验名称 |
基于Spring Security码云OAuth2认证 |
实验序号 |
四 |
| 姓名 |
张锐彬 |
学号 |
201641501208 |
班级 |
17软件2班 |
| 实验地点 |
家中 |
实验日期 |
2020.5.8 |
指导老师 |
黎志雄 |
| 教师评语 |
|
评阅老师 |
黎志雄 |
| 成绩(百分制) |
|
| 同组同学 |
|
#### 实验任务
1、 登录码云,fork实验四的作业仓库。
仓库地址:https://gitee.com/dgut-sai/spring-security-gitee-experiment-4
2、 根据下面的步骤填充代码,运行并测试成功:
1) 步骤一:创建接入码云的应用。

```
static final String CLIENT_ID = "4d59f303ee7e5ff2651bf89ae2050dbb984dd49bef3a1c4a26ced9329158cdbb";
static final String CLIENT_SECRET = "5e43917359e74197f27ff3adea1eb36e4c71ded4584bf0bd3bba68f138aaf79c";
```
2) 步骤二:编写重定向过滤器的业务逻辑。
```
String url = UriComponentsBuilder.fromUriString("https://gitee.com/oauth/authorize?client_id={client_id}&redirect_uri={redirect_uri}&response_type=code")
.buildAndExpand(CLIENT_ID, REDIRECT_URI).toString();
response.sendRedirect(url);
```
3) 步骤三:使用码云access_token API向码云认证服务器发送post请求获取access_token。
```
String url = UriComponentsBuilder.fromUriString(ACCESS_TOKEN_API_URI)
.buildAndExpand(code, CLIENT_ID, REDIRECT_URI, CLIENT_SECRET).toString();
RequestEntity entity = RequestEntity
.post(URI.create(url))
.headers(httpHeaders -> {
httpHeaders.add("User-Agent", "Ametatsu");
})
.build();
ResponseEntity response = rest.exchange(entity, String.class);
String body = response.getBody();
Map parseMap = new JacksonJsonParser(new ObjectMapper()).parseMap(body);
String accessToken = (String) parseMap.get("access_token");
return accessToken;
```
4) 步骤四:使用码云API获取授权用户的资料。
```
String url = UriComponentsBuilder.fromUriString(USER_INFO_URI)
.buildAndExpand(accessToken).toString();
RequestEntity entity = RequestEntity
.get(URI.create(url))
.headers(httpHeaders -> {
httpHeaders.add("User-Agent", "Ametatsu");
})
.build();
ResponseEntity response = rest.exchange(entity, String.class);
String body = response.getBody();
return new JacksonJsonParser(new ObjectMapper()).parseMap(body);
```
5) 步骤五:把自定义的两个Filter加进安全过滤链。
```
http.addFilterAfter(postProcess(new GiteeOAuth2LoginAuthenticationFilter()), SecurityContextPersistenceFilter.class);
http.addFilterAfter(postProcess(new GiteeOAuth2RedirectFilter()), SecurityContextPersistenceFilter.class);
```
6) 步骤六:把我们自定义的SecurityConfigurer应用到安全过滤链。
```
.and().apply(new GiteeOAuth2LoginConfigurer())
```
7) 步骤七:改造/user接口,返回码云用户资料给前端;改造user.ftlh模板用于显示用户资料。
```
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object principal = authentication.getPrincipal();
String username=((UserDetails) principal).getUsername();
String url = UriComponentsBuilder.fromUriString("https://gitee.com/api/v5/users/{username}")
.buildAndExpand(username).toString();
RequestEntity requestEntity = RequestEntity
.get(URI.create(url))
.headers(httpHeaders -> {
httpHeaders.add("User-Agent", "Ametatsu");
})
.build();
ResponseEntity response = rest.exchange(requestEntity, String.class);
try {
model.addAttribute("userInfo", objectMapper.readValue(response.getBody(), Map.class));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return "user";
```


