# 实验四 基于Spring Security码云OAuth2认证 **Repository Path**: Kim_zhihua/spring-experiment4 ## Basic Information - **Project Name**: 实验四 基于Spring Security码云OAuth2认证 - **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-12-07 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 实验四 基于Spring Security码云OAuth2认证 ## 一、实验目的 #### 1、掌握使用Spring Security框架; #### 2、掌握配置Spring Security的安全过滤链; #### 3、掌握编写Spring Security单元测试; #### 4、掌握创建接入码云的应用; #### 5、掌握码云OAuth2认证基本流程; #### 6、掌握使用码云API; #### 7、了解使用模板引擎或前端框架制作用户登陆界面。 ## 二、实验环境 #### 1、JDK 1.8或更高版本 #### 2、Maven 3.6+ #### 3、IntelliJ IDEA ## 三、实验任务 #### 1、登录码云,fork实验四的作业仓库。     仓库地址: #### 2、根据下面的步骤填充代码,运行并测试成功: #### 1)、OAuth基本认证流程。
#### 2)步骤一:创建接入码云的应用。     [码云参考文档](https://gitee.com/api/v5/oauth_doc#list-item-3)     回调地址 *必须* 是:http://localhost:8080/login/oauth2/code/gitee

**答:**
#### 3)步骤二:编写 *重定向过滤器* 的业务逻辑。     当用户访问/oauth2/gitee时,本重定向过滤器拦截请求,并将用户重定向到码云三方认证页面上。     **提示**:     a)在程序内部请求外部API接口时,可以使用RestTemplate或WebClient的http客户端,详情请参考:[WebMvc Client官方参考文档](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#webmvc-client)。     b)在构造uri的时候,可以使用Spring框架内部提供的工具类UriComponentsBuilder,详情请参考:[UriComponentsBuilder官方参考文档 - Mvc Uri Building](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-uri-building)。     c)API接口返回的Json字符串需要转换为Map、List时,推荐使用SpringBoot内部提供的解释器JacksonJsonParser(SpringBoot默认使用Jackson库),如果使用Gson库的话则解释器为GsonJsonParser。 **答:**
#### 4)步骤三:使用码云access_token API 向码云认证服务器发送post请求获取access_token。     逻辑参考:UsernamePasswordAuthenticationFilter **答:**
#### 5)步骤四:使用码云API获取授权用户的资料。     码云参考文档:

**答:**
#### 6)步骤五:把自定义的两个Filter加进安全过滤链。     **注意:**不要添加自定义过滤器放置在SecurityContextPersistenceFilter前面。     **官方参考文档 - Spring Security内置的过滤器顺序:**       Spring Security框架在初始化一条过滤链的时候,默认添加了一些过滤器,用于实现Spring Security的内部功能,如下图:

**答:**
#### 7)步骤六:把我们自定义的SecurityConfigurer应用到安全过滤链。 **答:**
#### 8)步骤七:改造/user接口,返回码云用户资料给前端;改造user.ftlh模板用于显示用户资料。     **提示:**     a、[Spring MVC的方法参数;](https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-arguments)     b、SecurityContextHolder 默认把安全上下文SecurityContext 保存在线程中,所以我们可以在当前线程应用程序中任何地方访问利用SecurityContextHolder访问安全上下文SecurityContext。
**答:**
简单的用户信息展示:
#### 9)步骤八:编写**单元测试**。模拟一个登录用户,访问受保护的接口/test,断言接口的返回内容body部分是否一致。     参考:[Spring Security 官方参考文档 - 测试](https://docs.spring.io/spring-security/site/docs/current/reference/html5/#test)。 **答:**
  进阶:基于 Spring Security 的微信登录如何写?或者 莞工中央认证CAS?   参考:[微信官方文档 - 网页授权](https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html) ## 四、实验要求 #### 1、实验项目push到码云的公开仓库,并把仓库网址登记在在线文档 #### 2、从码云仓库下载项目的ZIP文件,并交由班长汇总 #### 3、撰写实验报告,完成各个实验任务。各实验任务中的附图,是老师的演示代码,同学们应该模仿演示代码改为自己的代码。实验报告中必须完整描述各实验任务实现过程并附截图 #### 4、[网络空间安全学院实验报告模板(2019试行)](https://css.dgut.edu.cn/article?262=) #### 5、实验四项目仓库登记表 #### 6、严禁抄袭。如果不想项目仓库给别人看到,可以设置为私有仓库,并把老师的码云账号(dgsai@vip.qq.com)加入到仓库开发者以便老师检查