OAuth和SpringSocial

版权声明:作者已开启版权声明,如转载请注明转载地址。 https://blog.csdn.net/qq_34829447/article/details/87901325

一.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中配置

        扫描二维码关注公众号,回复: 5301599 查看本文章
        # 配置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()
    

猜你喜欢

转载自blog.csdn.net/qq_34829447/article/details/87901325
今日推荐