精华内容
下载资源
问答
  • 它把servlet容器实现的httpSession替换为spring-session,专注于解决 session管理问题,Session信息存储在Redis中,key是由UUID生成,且以hash结构存放在redis,可简单快速且无缝的集成到我们的应用中; Spring ...

    简介

    Spring Session 是Spring家族中的一个子项目,它提供一组API和实现,用于管理用户的session信息

    它把servlet容器实现的httpSession替换为spring-session,专注于解决 session管理问题,Session信息存储在Redis中,key是由UUID生成,且以hash结构存放在redis,可简单快速且无缝的集成到我们的应用中;

    Spring Session的特性:

    1. 提供用户session管理的API和实现
    2. 提供HttpSession,以中立的方式取代web容器的session,比如tomcat中的session
    3. 支持集群的session处理,不必绑定到具体的web容器去解决集群下的session共享问题

    SSM中使用SpringSession

    假设项目中已经配置号了redis,如若没有,请先参考ssm中集成redis

    1. maven依赖
     <dependency>
         <groupId>org.springframework.session</groupId>
         <artifactId>spring-session-data-redis</artifactId>
         <version>1.3.1.RELEASE</version>
     </dependency>
    
    1. 配置springSessionRepositoryFilter过滤器
     <filter>
        <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    注意,放在所有过滤器之首,我是放在字符编码过滤器之后的。

    1. spring中配置spring-session
     <!--定义SpringSession的配置Bean -->
        <bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
            <!--指定Cookie的序列化规则对象,用于改变SpringSessionCookie的存放规则 -->
            <property name="cookieSerializer"  ref="defaultCookieSerializer"/>
    
     		<!--设置Session的最大生命周期,单位为秒 默认有效期为1800 表示30分钟 -->
            <!--<property name="maxInactiveIntervalInSeconds" value="1800"/>-->
        </bean>
    
        <!--自定义Cookie规则对象 -->
        <bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer">
            <!--指定SpringSession的Cookie数据要存放到域名的根路径下,用于解决同域名下不同项目的Session共享 -->
            <property name="cookiePath" value="/"/>
            <!--指定SpringSession的Cookie数据要存放到根域名下,用于解决同根域名但是不同子域名的Session共享,
            低版本的Tomcat(版本小于8)如果报错要在根域名前多加个点.-->
            <property name="domainName" value="myweb.com"/>
        </bean>
    
    1. 定义SpringSession的配置Bean:RedisHttpSessionConfiguration

      a.指定Cookie的序列化规则对象参数
      b.设置Session的最大生命周期

    2. 自定义Cookie规则对象:DefaultCookieSerializer,这里要注意两个参数(后台区分是否是同一个session和路径和域名有关)

      a.解决同域名下不同项目的Session共享(Cookie的使用范围):设置 cookiePath 为域名的根路径
      例如:现在有两个项目,分别是:localhost:8080/web1和localhost:9090/web2,通过浏览器提供的开发人员工具(F12–>Application–>Cookies–>SESSION)可以发现,这两个请求的cookie的路径(path)不一致,一个是/web1,一个是/web2,虽然我们已经加了SpringSession共享机制,但是后台服务器认为这是两个不同的会话(session),故需要指定 cookiePath 参数为 “/”

      b.解决同根域名但是不同子域名的Session共享:设置 domainName 为要存放的根域名
      例如:还是上面的两个项目,只不过现在不再使用localhost了,而是使用域名,在C:\Windows\System32\drivers\etc\host文件中修改127.0.0.1的映射关系模拟不同的域名访问,这里使用的分别是:web1.web.com:8080/web1和web2.web.com:9090/web2,通过浏览器提供的开发人员工具可以发现,虽然这两个cookie的路径(path)都设置为了“/”,但是由于这两个cookie的域名(domain)不一致,虽然我们已经加了Spring Session共享机制,但是后台服务器同样认为这是两个不同的会话(session),故需要指定 domainName 参数为“web.com”
      注意,需要在每个项目中都加入以上步骤的配置。
      至此,SSM中配置spring-session完成!

    我在项目中,实现根域名或者根路径,采用的是nginx配置,根据不同的请求,跳转到不同的项目,这样就实现了根路径一致,可以使用多个tomcat来部署不同的项目了。

    SpringBoot配置Spring-Session

    1. 添加依赖
     <!--spring连接redis的起步依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!--springSession的依赖-->
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    
    1. 配置参数
    #连接redis三要素:ip,端口,密码
    spring.redis.host=192.168.29.128
    spring.redis.port=6379
    spring.redis.password=123456
    
    #设置SessionId存放在Cookie中的什么路径中 /表示根路径,用于解决同域名下不同项目的Session共享
    server.servlet.session.cookie.path=/
    
    #设置SessionId存放在Cookie中的根域名,用于解决同根域名不同二级子域名的Session共享
    server.servlet.session.cookie.domain=web.com
    
    #设置Session的最大生命周期,默认值为30m 表示30分钟
    server.servlet.session.timeout=30m
    

    原理

    1. 页面请求被全局的过滤器org.springframework.web.filter.DelegatingFilterProxy过滤
    2. 全局的过滤器是一个代理过滤器,它不执行真正的过滤逻辑,它代理了一个Spring容器中的名为:springSessionRepositoryFilter
      的一个过滤器
    3. 代理的这个 springSessionRepositoryFilter 过滤器是从spring容器中获取的,真正执行过滤逻辑的是
      SessionRepositoryFilter
    4. 该SessionRepositoryFilter过滤器覆盖了原来servlet中的request和response接口中定义的操作session方法,替换成自己的session方法
    5. 在过滤的时候,总是会执行一个finally语句块,在finally中提交session,保存到Redis的session以hash结构存放在redis中
    展开全文
  • 简称SSO,在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的其它应用系统 应用场景 同一家公司的不同子系统之间的登录认证 单点登录实现方式 基于cookie凭证 适用子系统之间主域名一致,如此这般才能...

    缘起

    • 简称SSO,在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的其它应用系统
    • 应用场景 同一家公司的不同子系统之间的登录认证
    • 单点登录实现方式
      • 基于cookie凭证
        • 适用子系统之间主域名一致,如此这般才能让不同子系统之间共享Cookie
      • 通过CAS实现SSO系统
        • 该方案适用于所有场景

    实现思路

    • 场景需求
      • 不同子系统之间是分离的,域名也不一样,比如主系统是 blog.test,子系统是 sub.blog.test
      • Laravel 添加 Cookie 到响应时默认作用域名是当前系统域名
    • 对写入 Cookie 的域名做额外设置,保证主系统和子系统之间可以共享 Cookie 凭证
    • 子系统和主系统之间共享用户表,子系统中不需要再设置独立的用户表
    • 子系统获取用户信息时通过 API 从主系统获取,需要实现 UserProvider 以便获取用户信息
    • 关键问题
      • Cookie是不能跨域传递的,将一个域的Cookie通知给其它应用(不在同一个域)

    解决方案

    • 共享Cookie

      • Cookie种在父域下,浏览器同域名下的Cookie则可以共享
      • 因此可以通过Cookie加解密的算法获取用户SessionID,从而实现SSO
    • 问题

      • 所有同域名的系统都能获取SessionID,易被修改且不安全
      • 跨域无法使用
    • ticket验证

      1. 用户访问某个子系统,发现如果未登录,则引导用户跳转到SSO登录页面
      2. 判断SSO是否已经登录
      3. 如果已经登录,直接跳转到回调地址,并返回认证ticket
      4. 如果未登录,用户正确输入用户名/密码,认证通过跳转到回调地址,并返回认证ticket
      5. 子系统获取ticket,调用SSO获取用户uid等信息,成功后让用户登录
    • cookie domain

      • Http协议在响应头部,可用Set-Cookie中的domain字段用来表示这个cookie所在的域
      • 设置cookie的父域名(domain),客户端访问子域,能够把设置的cookie返回
      • 涉及登录凭证(如票据或者用户名)应该加密,cookie不能存放隐私数据
      • 通过特殊设置setDomain()可以做到跨同一个大域下的两个子域

    焦点

    • 高效存储大量临时性的信任数据
    • 防止信息传递过程被篡改
    • 让SSO系统信任登录系统和免登系统

    解决措施

    • 采用类似与memcached的分布式缓存的方案,既能提供可扩展数据量的机制,也能提供高效访问
    • 采取数字签名的方法,要么通过数字证书签名,要么通过像md5的方式
    • 通过白名单来处理,生产信任关系

    登录中心Cookie设置

    • 单点登录需要一个独立的登录中心,所有系统登录皆从此入,通常将主系统作为登录中心
    • 设置Cookie域名
      • 设置主系统Cookie作用域名
      • 登录成功后,通过 CreateFreshApiToken中间件将令牌,SessionID写入到Cookie
      • 在子系统中可读取上述Cookie,并在请求头中带上

    流程

    • Cookie 域名通过 config/session.php 中的配置项 domain 来实现

    • 添加 CreateFreshApiToken 中间件(该中间件需要事先安装过 Passport)

    • 在 routes/api.php 中新增一条路由,返回认证用户信息

    • 设置Session存储媒介

      • 基于 Session 实现的单点登录,我们还要让主系统和子系统共享用户 Session 信息
      • 在登录中心(主系统)安装 predis 扩展 composer require predis/predis
    • 在子系统自定义 UserProvider 实现

      • 子系统项目,自定义一个 UserProvider实现来从主系统获取认证用户信息
        • 通过GuzzleHttp库请求,重写 retrieveById方法
    展开全文
  • Token,Cookie,Sessionsso

    千次阅读 2021-08-26 11:05:55
    Token(服务端生产字符串作为令牌,JWTUtil生产token,作为易失数据,丢失会让用户重新登录,可以存到redis,失效再...Cookie(保存在客户端),Session(保存在服务端HttpSession) 单点登录(Single Sign On)SSO 第一次通过

    Token(服务端生产字符串作为令牌,JWTUtil生产token,作为易失数据,丢失会让用户重新登录,可以存到redis,失效再用Redisson清除token)
    凡是需要验证的地方都要带上该token,然后服务器端验证token,成功返回需要结果,失败返回错误信息,让他重新登录。其中服务器上token设置一个有效期,每次APP请求的时候都验证token和有效期。
    Cookie(保存在客户端),Session(保存在服务端HttpSession)

    单点登录(Single Sign On)SSO

    第一次通过认证,返回用户一个凭据Ticket;用户再访问别的应用的时候,就会将这个Ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把Ticket送到认证系统进行效验,检查Ticket的合法性

    展开全文
  • springcloud security和springsession实现sso一、目前实现sso的三种方式二、三种实现方式见解三、代码新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码...

    一、目前实现sso的三种方式

    1.使用oauth2,不用session,构建一个authorization server,其他微服务都定义成resource server,使用rsa私钥签名jwt token访问服务。将认证生成的jwt token存储在前台session storage,每次请求,携带authorization 请求头请求服务。
    2.使用oauth2,使用session,构建一个authorization server,其他微服务都定义成resource server,使用rsa私钥签名jwt token访问服务。但是不将jwt token保存在前台,而是将jti存于cookie中。使用鉴权网关,每次请求通过jti获取jwt,再请求后台服务。
    3.使用spring session,实现sso,这种方式相对要简单。这种方式是传统的方式。也是本博客将要分享的方式。

    二、三种实现方式见解

    前两种方式大体相同,唯一区别在于jwt存储位置。首先对于前台,博主不熟,据说session storage只能当前页面使用,通过这个特性保证jwt口令的安全。但是衍生出第二种,应该是部分架构师对此的不放心,所以将jwt改为存储在后台,防止jwt口令的泄漏。但是这操作也相当于将jwt口令从无状态特性转变为有状态特性。

    关于jwt的特性,在此做简单的讲解。jwt本身是一个包含用户名,口令有效期,用户权限,还有其他一些附加信息的json通过RSA私钥签名生成的无状态字符串,大体格式是xxx.xxx.xxx。即用.分割成了三段的字符串。资源服务器使用RSA公钥解密生成json,如果能正常解密成json,说明是授权服务器颁发的口令,否则说明是伪造的,即鉴权失败。因此必须保证私钥的安全!这个过程中,资源服务器不会再次请求授权服务器,只需要能正常解密成json就行。所以一旦jwt口令颁发,只能等该jwt口令过期,用户无法将该口令注销,即使修改密码。而且jwt本身包含权限信息,如果新增权限,jwt口令也无法及时刷新权限信息。由于jwt本身包含过期时间,所以jwt颁发后是无法续期的。当然可以用refresh token来刷新口令,但刷新口令本身也有个过期时间。所以像一般app这种常年累月不需要重复登录的场景,博主不知道如何实现,几乎所有大吹jwt优越性的博客也对这几点避而不谈。

    总结网上博客对oauth2推荐的几种理由:①利于架构的横向扩展②相比传统方式,减少与redis的交互,性能更高。关于这两个理由,博主并不十分认同。因为国内应该没有几家企业有这样的业务,也没有几家公司有这样的系统,会因为使用redis共享session而制约系统的扩展。减少redis的交互,性能更高这个论点,redis单次请求获取短字符串的速度在几十微秒,jwt通过1024位rsa解密速度也在这数量级,还是前面那句话,没几家公司有这样的业务!当redis成为瓶颈的时候,整个系统往往其他地方已经撑不住了!另外jwt目前还有一个bug,博主本人碰到过,也有部分网友碰到过,有时候生成的jwt在授权服务器能正常解析,但是在资源服务器却解析不了,这种情况常出现在资源服务器多次重启的时候(按理来说和重启啥的无关,只能注销该jwt重新生成一个,因为授权服务器生成的jwt未失效前,重复登录,授权服务器不会重新生成jwt,因为生成jwt本身是个成本较高的操作)!当然jwt还有个优点,也是jwt诞生的背景,用于授权第三方登录,而不需要泄漏密码!

    三、代码

    https://github.com/YaShanBoy/sso-springsession.git

    代码上传到了GitHub,如有问题请留言。

    代码有点乱,因为当时想将oauth2和security两者认证方式都组合在一起,所以会留有部分oauth2的配置

    四、总结

    个人认为上述三种方案都不够完美,如果单纯用oauth2,注销和续签博主没有好的解决方案,网上也没看到解决方案;如果单纯用springsecurity+springsession就没法授权三方应用不泄漏密码。本人本想将oauth2和security结合,单点登录工程microservice-security-auth设置为oauth2授权服务器,其余设置为资源服务器,但是当这样设置后,原本的cookie无法进行认证。个人推测修改认证过滤器链能结合两者优势,但是限于某些原因,本人近期不打算花费时间琢磨了。

    若有人知道解决方案,请告知!万分感谢!

    展开全文
  • 在一个Tomcat上我们有可能部署多个web应用,session如果共享就会省去很多麻烦事。 想要达到这个目的只需在host中加上: 这个段配置在server.xml 初始是被注释的,释放注释就可以了,采用Tomcat容器认证,这样...
  • SSO session失效问题

    2017-01-02 17:56:52
    系统使用的是CAS SSO, 使用tomcat启动,启动后停留在了登录页面,待sesseion失效后,...当成功登录后地址是:http://localhost:8080/ssoserver/login?execution=e1s1 然后点击刷新,同样出现上面的404问题。 对
  • SSO基于全局Session和局部Session的实现

    千次阅读 2018-05-24 12:50:04
    推荐一下自己的一个数据结构与算法整合的库,还处于更新状态 2019-01-12 18:23 更: demo明天给出 . emmmmm我记得这个demo应该是18年的啊,怎么19是上个月给的?蛤?--- 2019-01-13 18:51 更: ...什么是sso:single si...
  • 1、主要根绝ajax使用jsonp跨域请求时候 同一个单点服务器会使用相同的session 整个项目sessionId相同 2、任何一个项目登录之后 将sessionId和登录成功的用户信息保存到redis中 3、其他站点使用JsonP请求验证登录的...
  • cas sso session过期问题详谈

    千次阅读 2018-02-06 15:32:18
    最近在设置sso session的过期问题,发现网上基本没有4.2.*版本的设置详情,特地研究了下; Configuring-Ticket-Expiration-Policy.md是记录session 过期时间的配置; TicketGrantingTicketExpirationPolicy ...
  • Cookie + Session + OAuth + SSO

    千次阅读 2012-09-02 23:21:53
    周五的技术沙龙,Rain和Joey讲了关于Cookie + Session + OAuth + SSO的一些知识。觉得很是有用,所以又从网上翻资料出来,做个记录。 HTTP协议 HTTP虽然是基于TCP/IP,但是HTTP本身却是无状态协议。每次...
  • 最近一段时间,又有客户要做sso单点登录。 我以前设计了专门用于点击登录的页面,web.config里面放置可修改的,验证中心的地址。这样如果很多客户都用同一种单点登录请求方式的时候,不同的客户仅仅修改web....
  • Session, Token and SSO 有什么区别 Basic Compareation Session-based Authentication In Session-based Authentication the Server does all the heavy lifting server-side. Broadly speaking a client ...
  • Cookie在Web会话中起到了最关键性的作用,其实大家所熟知的SessionSSO等,或者大胆一点的假设,所有仅通过浏览器、HTTP协议(不包括安装插件等特殊情况)实现的会话,底层都应该是依靠Cookie来实现的(呵呵有待...
  • sso-session-link-api-源码

    2021-04-06 16:24:07
    sso-session-link-api 可以与用于从API平台到网络的SSO用户 POST / sso / ssoin / sessionInfo 注意:需要MDTP承载令牌 请求正文示例 { " id_token " : " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ0ZXN0...
  • sso简单原理及实现 SSO 注意:浏览器在访问相同域的时候才会携带Cookie cookie session token的区别 cookie session 区别二 CSRF攻击与防御 token及用token防csrf
  • @Configuration @EnableAuthorizationServer //认证服务器 @EnableJdbcHttpSession // session 持久化 public class OAuth2AuthServerConfig extends AuthorizationServerConfigurerAdapter {
  • 单点登录(SSO)—微服务之间的session共享 应用:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的系统 一:同域名下SSO 可以使用Cookie-Session机制 cookie共享:由于cookie不能跨域,需要将Cookie的...
  • SSO单点登陆基于Session简单实现 单点登陆活动图 废话不多说直接上代码咯,什么好处,实现原理相关资料baidu去,基本都一样,就不复制了 1 服务端代码 1.1 登陆跳转注销代码 controller层代码 package ...
  • CAS 5.X SSO SESSION与COOKIE

    2019-09-01 10:06:10
    SSO 通用设置 # cas.sso.allowMissingServiceParameter=true # cas.sso.createSsoCookieOnRenewAuthn=true # cas.sso.proxyAuthnEnabled=true # cas.sso.renewAuthnEnabled=true Warning Cookie 当用户访问受保护的...
  • SSO - 使用cookie和session实现单点登录

    千次阅读 2020-06-22 01:19:45
    单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或...
  • https://gitee.com/oschinaforZgx/notes/blob/master/Work/Software/Backend/Java/Architecture/%E5%88%86%E5%B8%83%E5%BC%8F%E6%A1%86%E6%9E%B6/cookieSession/cookieSession.md 转载于:...
  • sso认证(A网站、B网站、C登录认证网站): 1、用户访问A网站,服务A通过session("openid")判断是否登录 2、没有登录跳转到C登录认证网站登录认证,认证通过后 C网站创建 setSession("openId")为C...
  • SSO 的实现机制不尽相同,大体分可为 Cookie 机制和 Session 机制两大类。 · WebLogic 通过 Session 共享认证信息。 Session 是一种服务器端机制,当客户端访问服务器时,服务器为客户端创建一个惟一的...
  • SSO】单点登录 & Session共享

    千次阅读 2018-08-23 23:20:47
    Tomcat集群可能因为两次访问的Session不一致导致登录失败,无法访问后续页面; 解决可以通过tomcat互相进行Session共享实现,但是这仅仅试用于小集群; 如果集群变大,就会有大量Session进行互相共享,负载很大; ...
  • 1.什么是SSO?什么是单点登录 1.1.session存了什么? 1.2.浏览器同源策略 1.3.session共享与session复制(不可用方案) 1.4 session复制到session不复制| 1.5.跨域访问2.SpringSession+redis 3. token(一串字符串...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,965
精华内容 6,786
关键字:

sessionsso