# 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) 步骤一:创建接入码云的应用。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0518/195533_09daebc3_5723701.png "屏幕截图.png") ``` 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"; ``` ![输入图片说明](https://images.gitee.com/uploads/images/2020/0518/204824_42a6d100_5723701.png "QQ截图20200518183210.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/0518/204928_c4bc335d_5723701.png "QQ截图20200518204915.png") ![直接爬取码云样式](https://images.gitee.com/uploads/images/2020/0518/205004_e6fa3f48_5723701.png "QQ截图20200518204953.png")