一.OAuth协议简介
1.OAuth协议要解决的问题
- 主要思路:用户不将用户名和密码给予第三方应用,而是给一个令牌,当访问数据时使用令牌(令牌中包含可以访问的信息和访问时长等信息)
2.OAuth协议中的各种角色
- 服务提供商Provider:提供令牌Token(谁提供令牌谁就是服务提供商)
- 认证服务器Authorization Server:用于生成令牌
- 资源服务器Resource Server:保存用户的资源,用于验证令牌
- 资源所有者Resource Owner:将被获取资源的对象(也就是用户)
- 第三方应用Client:即要获取资源的第三方
3.OAuth协议运行流程
- OAuth协议中的授权模式
- 授权码模式(authorization code)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
- 简化模式(implicit)
4.授权码模式
- 用户同意授权的过程是在认证服务器上完成的
- 第3步是携带授权码返回(要求第三方应用需要有服务器),再次使用授权码发向认证服务器申请令牌
二.SpringSocial基本原理
1.逻辑流程图
2.SpringSocial相关概念
- AbstractOAuth2ServiceProvider抽象类:继承定义服务提供商
- OAuth2Template类:完成OAuth协议执行的流程
- AbstractOAuth2ApiBinding抽象类:封装第六步获取信息接口的实现
- OAuth2Connection类:封装前六步完成后获取到的用户信息对象
- OAuth2ConnectionFactory类:用于创建Connection实例
- ApiAdapter接口的实现:用户适配APi(自定义的UserDetails)和Connection(字段是固定的数据结构)
- JdbcUsersConnectionRepository:针对数据库中UserConnection表进行增删改查操作
3.管理session
-
可以通过在config中增加配置添加对session的管理,比如session失效时间,一个地方用户登录后其他地方登陆会把之前的session替掉等相关操作
-
实例代码
.sessionManagement() .invalidSessionUrl("/session/invalid") .maximumSessions(1) .maxSessionsPreventsLogin(true) .expiredSessionStrategy(new 自定义的SessionStrategy实例) .and() ...
-
当使用集群构建项目时,当用户在服务器1上登陆后,如果下次访问时服务器1占用已满则会将请求发送到服务器2上,此时因为服务器2上没有对应的session则会需要重新登录(这是不可取的)。故解决这个问题,可以将session存储到其他地方,两个服务器校验session都访问存储。
-
使用spring-session(需要引入)进行操作,支持REDIS,MONGO,HASH_MAP(本机)…
-
此处将介绍存储至REDIS(原因:性能快[内存数据库],超时时间可以配置[不用手动清数据库])
-
到官网下载redis,并解压后使用make命令安装,使用
./src/redis-server
启动redis服务器 -
在properties中配置
# 配置spring session存储到的地方,默认为NONE即本机session spring.session.store-type=REDIS # 配置redis spring.redis.host = ... spring.redis.port = ...
-
此时放到session中的内容都放到session中了,放的对象类(包括类中的属性)需要实现Serializable接口
-
-
4.退出登录
-
退出登录默认的url是
/logout
,我们也可以在config文件夹下配置退出的相关信息 -
实例代码
.logout() .logoutUrl("/signOut")//将默认退出url为/logout改为/signOut .logoutSuccessUrl("/logout-url")//成功退出后访问的html //.logoutSuccessHandler(logoutHandler)成功退出后处理,不能和logoutSuccessUrl同时使用,需实现LogoutSuccessHandler接口 .deleteCookies("JESSIONID")//设置删除cookie .and()