# 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、创建接入码云的应用。 ![](https://images.gitee.com/uploads/images/2020/0515/181329_0e889a2a_5507626.png "屏幕截图.png") #### 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权限")); } ### 三、运行结果 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0515/181707_2d834f35_5507626.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/0515/181736_c3a9c5b2_5507626.png "屏幕截图.png")