# javaee_实验4
**Repository Path**: deepduckfts/javaee_experiment4
## Basic Information
- **Project Name**: javaee_实验4
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-05-15
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
实验四
课程名称:企业级开发框架专题
学期:2020春季
|
实验名称 | 基于Spring Security码云OAuth2认证 | 实验序号 | 四 |
|
姓 名 | 李振辉 | 学 号 | 201741404223 | 班 级 | 17软件2班 |
|
实验地点 | | 实验日期 | 2020/5/14 | 指导老师 | 黎志雄 |
|
教师评语 | *** | 实验成绩 | 评阅教师 |
| 百分制 | ** |
|
同组同学 | 无 |
### 一、 实验目的
1、 掌握使用Spring Security框架;
2、 掌握配置Spring Security的安全过滤链;
3、 掌握编写Spring Security单元测试;
4、 掌握创建接入码云的应用;
5、 掌握码云OAuth2认证基本流程;
6、 掌握使用码云API;
7、 了解使用模板引擎或前端框架制作用户登录界面。
### 二、实验步骤
#### 1、 登录码云,fork实验四的作业仓库。仓库地址:https://gitee.com/dgut-sai/spring-security-gitee-experiment-4
#### 2、创建接入码云的应用。

#### 3、编写重定向过滤器的业务逻辑。
```
response.sendRedirect(StringFormatUtil.format(AUTHENTICATION_URL, CLIENT_ID, REDIRECT_URI));
```
#### 4、使用码云access_token API向码云认证服务器发送post请求获取access_token。
```
URI uri = UriComponentsBuilder
.fromUriString(StringFormatUtil.format(ACCESS_TOKEN_API_URI, code, CLIENT_ID, REDIRECT_URI, CLIENT_SECRET))
.build(42);
RequestEntity requestEntity = RequestEntity.post(uri).header("User-Agent", "spring-security-gitee-experiment").build();
ResponseEntity responseEntity = rest.exchange(requestEntity, String.class);
String json = responseEntity.getBody();
Map map = new JacksonJsonParser().parseMap(json);
return String.valueOf(map.get("access_token"));
```
#### 5、使用码云API获取授权用户的资料。
```
URI uri = UriComponentsBuilder
.fromUriString(StringFormatUtil.format(USER_INFO_URI, accessToken))
.build(42);
RequestEntity requestEntity = RequestEntity.get(uri).header("User-Agent", "spring-security-gitee-experiment").build();
ResponseEntity responseEntity = rest.exchange(requestEntity, String.class);
String json = responseEntity.getBody();
Map map = new JacksonJsonParser().parseMap(json);
return map;
```
#### 6、把自定义的两个Filter加进安全过滤链
```
http.addFilterAfter(new GiteeOAuth2RedirectFilter(), SecurityContextPersistenceFilter.class)
.addFilterAfter(new GiteeOAuth2LoginAuthenticationFilter(), SecurityContextPersistenceFilter.class);
```
#### 7、改造/user接口,返回码云用户资料给前端;改造user.ftlh模板用于显示用户资料。(自定义UserInfo继承自User)
```
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
GiteeOAuth2LoginConfigurer.UserInfo userInfo = (GiteeOAuth2LoginConfigurer.UserInfo) authentication.getPrincipal();
model.addAttribute("userInfo", userInfo.getMap());
model.addAttribute("securityDetails", authentication.getDetails());
return "user";
```
#### 8、模拟一个登录用户,访问受保护的接口/test,断言接口的返回内容body部分是否一致。
@Test
@WithMockUser(authorities = "USER")
public void test() throws Exception {
////////////////////////////////////////////
/// 步骤八:模拟一个登录用户,访问受保护的接口/test,断言接口的返回内容body部分是否一致。
////////////////////////////////////////////
mvc.perform(MockMvcRequestBuilders.get("/test"))
.andExpect(MockMvcResultMatchers.content().string("访问/test接口成功,你拥有USER权限"));
}
### 三、运行结果

