spring session 和 spring security整合
背景:
我要做的系统前面放置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整合的更多相关文章
- 实战开发,使用 Spring Session 与 Spring security 完成网站登录改造!!
上次小黑在文章中介绍了四种分布式一致性 Session 的实现方式,在这四种中最常用的就是后端集中存储方案,这样即使 web 应用重启或者扩容,Session 都没有丢失的风险. 今天我们就使用这种方 ...
- 使用Spring Session实现Spring Boot水平扩展
小编说:本文使用Spring Session实现了Spring Boot水平扩展,每个Spring Boot应用与其他水平扩展的Spring Boot一样,都能处理用户请求.如果宕机,Nginx会将请 ...
- 别再让你的微服务裸奔了,基于 Spring Session & Spring Security 微服务权限控制
微服务架构 网关:路由用户请求到指定服务,转发前端 Cookie 中包含的 Session 信息: 用户服务:用户登录认证(Authentication),用户授权(Authority),用户管理(R ...
- Re:从零开始的Spring Session(三)
上一篇文章中,我们使用Redis集成了Spring Session.大多数的配置都是Spring Boot帮我们自动配置的,这一节我们介绍一点Spring Session较为高级的特性. 集成Spri ...
- Re:从零开始的Spring Session(二)
上一篇文章介绍了一些Session和Cookie的基础知识,这篇文章开始正式介绍Spring Session是如何对传统的Session进行改造的.官网这么介绍Spring Session: Spri ...
- Re:从零开始的Spring Session(一)
Session和Cookie这两个概念,在学习java web开发之初,大多数人就已经接触过了.最近在研究跨域单点登录的实现时,发现对于Session和Cookie的了解,并不是很深入,所以打算写两篇 ...
- 通过Spring Session实现新一代的Session管理
长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...
- 转:通过Spring Session实现新一代的Session管理
长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...
- Spring Session加Redis
session是一个非常常见的概念.session的作用是为了辅助http协议,因为http是本身是一个无状态协议.为了记录用户的状态,session机制就应运而生了.同时session也是一个非常老 ...
随机推荐
- MEF Parts Sample
namespace Microshaoft.MEF.Contracts { using System; public delegate void ExceptionEventHandler<TS ...
- fabric devenv Vagrantfile配置
Vagrantfile文件只会在第一次执行vagrant up时调用执行,其后如果不明确使用vagrant reload,则不会被强制重新加载. # This is the mount point f ...
- Android Studio 之 no render target selected
今天第一次使用android studio, 莫名其妙出现 no render target selected的错误,没有设计界面, 各种百度之后在 stackoverflow.com/questio ...
- 破解加密PDF文件pdfcrack
破解加密PDF文件pdfcrack PDF是常见的文档格式.它允许用户设置双重密码来保护文档.第一重是用户密码(user password),当打开PDF文档,输入该密码.第二重是所有者密码(ow ...
- input的实时监控
<input id="phone" type="tel" placeholder="请输入手机号"> $("#phon ...
- AMR 转mp3 失败
private void changeToMp3(String sourcePath) { File source = new File(sourcePath); String mp3TargetPa ...
- java 深度遍历文件夹中的所有文件
看标题就知道是什么意思了吧,所以就不多说了,直接贴代码: import java.io.*; public class files { private static void iterateFile( ...
- ov5640摄像头设备驱动
http://www.cnblogs.com/firege/p/5806121.html (驱动大神) http://blog.csdn.net/yanbixing123/article/detai ...
- JavaScript第一天
1.静态的网页技术和动态的网页技术 静态网页是相对于动态网页而言,是指没有后台数据库.不含程序和不可交互的网页.你编的是什么它显示的就是什么.不会有任何改变.静态网页相对更新起来比较麻烦,适用于一般更 ...
- C# 线程调用主线程中的控件
由于项目的需要,最近几天一直在做串口和数据库.由于C#使用的时间不长,所以在编写代码和调试的过程中总是遇到意想不到的问题,比如在使用串口接收数据的时候,在接收数据事件中想把接收的数据放入一个textb ...