背景:

我要做的系统前面放置zuul。 使用自己公司提供的单点登录服务。后面的业务应用也是spring boot支撑的rest服务。

目标:

使用spring security管理权限包括权限。用户请求过来之后。自动单点登录,zuul以及后面的所有应用共享session(含权限和登录)信息。

计划:

工作分为zuul部分和rest部分

在zuu这边,我们需要

    • 实现和配置filter,调用已有的单点登录服务,实现用户身份校验,权限获得。并且存入session中
    • 配置spring session。确保session被持久化。在我选的方案里是redis

在rest这边

    • 配置spring session。可以从redis中读取session
    • 实现Filter,未登录的返回错误

zuul和rest应用都启用spring session。 从zuul打到rest上的请求自动识别为已登录的,从session中获得权限信息。业务基于权限控制。

spring默认的filter是这些。其中springSecurityFilterChain比较特殊是安全相关的一堆filter

name=metricsFilter, filterClass=org.springframework.boot.actuate.autoconfigure.MetricsFilter
name=characterEncodingFilter, filterClass=org.springframework.boot.web.filter.OrderedCharacterEncodingFilter
name=springSessionRepositoryFilter, filterClass=org.springframework.session.web.http.SessionRepositoryFilter
name=hiddenHttpMethodFilter, filterClass=org.springframework.boot.web.filter.OrderedHiddenHttpMethodFilter
name=httpPutFormContentFilter, filterClass=org.springframework.boot.web.filter.OrderedHttpPutFormContentFilter
name=requestContextFilter, filterClass=org.springframework.boot.web.filter.OrderedRequestContextFilter
name=springSecurityFilterChain, filterClass=org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean$1
name=webRequestLoggingFilter, filterClass=org.springframework.boot.actuate.trace.WebRequestTraceFilter
name=shallowEtagHeaderFilter, filterClass=com.gome.sso.common.filter.UserCookieCheckFilter
name=applicationContextIdFilter, filterClass=org.springframework.boot.web.filter.ApplicationContextHeaderFilter
name=Tomcat WebSocket (JSR356) Filter, filterClass=org.apache.tomcat.websocket.server.WsFilter

启用web security之后默认的一套filter是这样的。我们可以自己开发一个来替换掉BasicAuthenticationFilter

0 = {WebAsyncManagerIntegrationFilter@13209}
1 = {SecurityContextPersistenceFilter@13210}
2 = {HeaderWriterFilter@13211}
3 = {LogoutFilter@13212}
4 = {BasicAuthenticationFilter@13213}
5 = {RequestCacheAwareFilter@13214}
6 = {SecurityContextHolderAwareRequestFilter@13215}
7 = {AnonymousAuthenticationFilter@13216}
8 = {SessionManagementFilter@13217}
9 = {ExceptionTranslationFilter@13218}
10 = {FilterSecurityInterceptor@13219}

替换的代码如下。继承WebSecurityConfigurerAdapter并覆盖com.gome.cs.online.WebSecurityConfig#configure方法

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    .....

    @Override
protected void configure(HttpSecurity http) throws Exception {
CustomSsoFilter ssoFilter = new CustomSsoFilter();
ssoFilter.setLoginUrl(loginUrl);
http.addFilterAfter(ssoFilter, LogoutFilter.class);
}
}

这个配置下除了没有了,连FilterSecurityInterceptor也没有了,

zuul的默认设置在转发时会删除掉这些headerCookie,Set-Cookie,Authorization。 对于我们信任的rest当然就不需要了

要进行如下设置

zuul:
routes:
users:
path: /myusers/**
sensitiveHeaders: Cookie,Set-Cookie,Authorization
serviceId: myuser-rest

好了,这样我们就实现了在zuul和其背后的应用间共享session

spring session 和 spring security整合的更多相关文章

  1. 实战开发,使用 Spring Session 与 Spring security 完成网站登录改造!!

    上次小黑在文章中介绍了四种分布式一致性 Session 的实现方式,在这四种中最常用的就是后端集中存储方案,这样即使 web 应用重启或者扩容,Session 都没有丢失的风险. 今天我们就使用这种方 ...

  2. 使用Spring Session实现Spring Boot水平扩展

    小编说:本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求.如果宕机,Nginx会将请 ...

  3. 别再让你的微服务裸奔了,基于 Spring Session & Spring Security 微服务权限控制

    微服务架构 网关:路由用户请求到指定服务,转发前端 Cookie 中包含的 Session 信息: 用户服务:用户登录认证(Authentication),用户授权(Authority),用户管理(R ...

  4. Re:从零开始的Spring Session(三)

    上一篇文章中,我们使用Redis集成了Spring Session.大多数的配置都是Spring Boot帮我们自动配置的,这一节我们介绍一点Spring Session较为高级的特性. 集成Spri ...

  5. Re:从零开始的Spring Session(二)

    上一篇文章介绍了一些Session和Cookie的基础知识,这篇文章开始正式介绍Spring Session是如何对传统的Session进行改造的.官网这么介绍Spring Session: Spri ...

  6. Re:从零开始的Spring Session(一)

    Session和Cookie这两个概念,在学习java web开发之初,大多数人就已经接触过了.最近在研究跨域单点登录的实现时,发现对于Session和Cookie的了解,并不是很深入,所以打算写两篇 ...

  7. 通过Spring Session实现新一代的Session管理

    长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...

  8. 转:通过Spring Session实现新一代的Session管理

    长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...

  9. Spring Session加Redis

    session是一个非常常见的概念.session的作用是为了辅助http协议,因为http是本身是一个无状态协议.为了记录用户的状态,session机制就应运而生了.同时session也是一个非常老 ...

随机推荐

  1. Ubuntu菜鸟入门(三)—— 无用软件卸载,wps等常用软件安装

    一  移除不需要的软件 sudo apt-get remove libreoffice-common sudo apt-get remove unity-webapps-common sudo apt ...

  2. Linux第03天

    Linux 第03天 1.Linux帐号和ACL权限管理 1.帐号和用户组 1.1 用户标识符————UID(root为0 系统用户为1~499 普通用户为500~65535) 1.2 用户组标识符— ...

  3. 前端SEO技巧

    前几天在慕课网上学习了“SEO在网页制作中的应用”,觉得挺好.挺有用的,今天,特此做了一个小小的笔记,也算是对学习过后的一个总结. 一.搜索引擎工作原理 当我们在输入框中输入关键词,点击搜索或查询时, ...

  4. 2014亚马逊在线笔试题目及解决方案(MMChess问题)

    整体思路:关键是需要知道当前Steps数组中的全排列即可,而且需要不重复的全排列.即关键在于非递归的全排列实现即可~ 其实直接利用STL中的next_permutation算法的,这里我又自己实现了一 ...

  5. Educational Codeforces Round 12 E Beautiful Subarrays

    先转换成异或前缀和,变成询问两个数异或≥k的方案数. 分治然后Trie树即可. #include<cstdio> #include<algorithm> #define N 1 ...

  6. Django 基本命令

    1. 新建一个 django project django-admin.py startproject project-name 一个 project 为一个项目,project-name 项目名称, ...

  7. 如何激活win10 win10激活工具下载

    http://www.2cto.com/os/201511/448815.html 官方的win10出来了,可是装在上电脑后要花钱才能用,费用要好几百呢,感觉很不值得,这里我教给大家个免费激活官方wi ...

  8. Android课程---关于数据存储的学习(2)

    手机外部存储的学习 activity_data2.xml <?xml version="1.0" encoding="utf-8"?> <Li ...

  9. 《Linux内核设计与实现》读书笔记 第五章 系统调用

    第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用在用户空间进程和硬件设备间添加了一个中间层, 作用:为用户空间提供了一种 ...

  10. 2016年终分析(传统开发与网络时代的Java开发)

    2016重大事件:(在此将2016年的开发称为传统开发) 1.乌镇互联网大会大会(大数据&云计算) 2.某东struts2安全漏洞 3.作为一个程序呀对于淘宝双11和双12的分析应该是最好的案 ...