# spring4 **Repository Path**: homeOFlimu/spring4 ## Basic Information - **Project Name**: spring4 - **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-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

实验四

课程名称:企业级开发框架专题

学期:2020春季


实验名称基于Spring Security码云OAuth2认证实验序号
姓 名利牧学 号201741412124班 级17软卓1班
实验地点实验日期2020/5/18指导老师黎志雄
教师评语***实验成绩 评阅教师
百分制**
同组同学
### 一、 实验目的 1、 掌握使用Spring Security框架; 2、 掌握配置Spring Security的安全过滤链; 3、 掌握编写Spring Security单元测试; 4、 掌握创建接入码云的应用; 5、 掌握码云OAuth2认证基本流程; 6、 掌握使用码云API; 7、 了解使用模板引擎或前端框架制作用户登录界面。 ### 二、实验步骤 #### 1、创建接入码云的应用。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0518/211856_9a5c2a3d_4839312.png "截屏2020-05-18下午9.18.23.png") #### 2、编写重定向过滤器。 ``` response.sendRedirect(String.format("https://gitee.com/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code", CLIENT_ID, REDIRECT_URI)); ``` #### 3、编写get access_token。 ```JAVA String request_url = UriComponentsBuilder.fromUriString(ACCESS_TOKEN_API_URI) .buildAndExpand(code, CLIENT_ID, REDIRECT_URI, CLIENT_SECRET).toString(); RequestEntity requestEntity = RequestEntity.post(URI.create(request_url)) .headers(httpHeaders -> httpHeaders.add("User-Agent", "Mozilla/5.0")) .build(); ResponseEntity response = rest.exchange(requestEntity, String.class); return response.getBody(); ``` #### 4、编写getuserInfo。 ``` String request_url = UriComponentsBuilder.fromUriString(USER_INFO_URI) .buildAndExpand(accessToken).toString(); RequestEntity requestEntity = RequestEntity.get(URI.create(request_url)) .headers(httpHeaders -> { httpHeaders.add("User-Agent", "Mozilla/5.0"); }) .build(); ResponseEntity responseEntity = rest.exchange(requestEntity, String.class); String json = responseEntity.getBody(); Map res = new JacksonJsonParser().parseMap(json); return res; ``` #### 5、编写安全过滤链 ``` http.addFilterAfter(new GiteeOAuth2RedirectFilter(), SecurityContextPersistenceFilter.class); http.addFilterAfter(new GiteeOAuth2LoginAuthenticationFilter(), SecurityContextPersistenceFilter.class); ``` #### 6、改造/user接口 ``` Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); UserInfo u = (UserInfo) authentication.getPrincipal(); model.addAttribute("userInfo",u.getUser()); return "user"; ``` #### 7、运行结果 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0518/234627_4558f270_4839312.png "截屏2020-05-18下午11.46.00.png") #### 7、测试,访问受保护的接口/test ``` @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/0518/234827_8b18723c_4839312.png "截屏2020-05-18下午11.48.08.png")