spring security 实现sso单点登录


1、主要的几个类

1) SecurityConfig 

自定义security策略,继承WebSecurityConfigurerAdapter,用于进行spring security的各种配置

2)JWTAuthenticationFilter

自定义验证类,继承UsernamePasswordAuthenticationFilter,用于验证用户并生成token,有两个主要方法:attemptAuthentication:接收并解析用户凭证。

successfulAuthentication:用户成功登录后,这个方法会被调用,在这个方法里生成token并跳转到/getSystemMessage接口,该接口用于携带token重定向至systemId对应的子系统页面。

unsuccessfulAuthentication:用户登录失败后,调用这个方法返回403错误提示。

3)JWTAuthorizationFilter

自定义授权类,继承BasicAuthenticationFilter,用于验证用户token。

2、security认证过程

(1)用户名和密码被过滤器获取到,封装成Authentication,通常情况下是UsernamePasswordAuthenticationToken这个实现类。 

(2)AuthenticationManager 身份管理器负责验证这个Authentication 。

(3)认证成功后,AuthenticationManager身份管理器返回一个被填充满了信息的(包括上面提到的权限信息,身份信息,细节信息,但密码通常会被移除)Authentication实例。 

(4)SecurityContextHolder安全上下文容器将第3步填充了信息的Authentication,通过SecurityContextHolder.getContext().setAuthentication()方法,设置到其中。

3、security 认证架构

1)常用过滤链

HTTP Basic 认证请通过过滤器链, 到达 BasicAuthenticationFilter

登录认证被 UsernamePasswordAuthenticationFilter 识别,拦截并处理

2)基于用户凭证创建 AuthenticationToken

以表单登录为例子, 用户在登录表单中输入用户名和密码, 并点击确定, 浏览器提交POST请求到服务器, 穿过过滤器链, 被 UsernamePasswordAuthenticationFilter 识别, UsernamePasswordAuthenticationFilter 提取请求中的用户名和密码来创建 UsernamePasswordAuthenticationToken 对象。

3)把组装好的 AuthenticationToken 传递给 AuthenticationManagager

组装好的 UsernamePasswordAuthenticationToken 对象被传递给 AuthenticationManagager 的 authenticate 方法进行认证决策。AuthenticationManager 只是一个接口, 实际的实现是 ProviderManager。

ProviderManager 有一个配置好的认证提供者列表(AuthenticationProvider), ProviderManager 会把收到的 UsernamePasswordAuthenticationToken 对象传递给列表中的每一个 AuthenticationProvider 进行认证。

4)认证处理

ProviderManager 会把收到的 UsernamePasswordAuthenticationToken 对象传递给列表中的每一个 AuthenticationProvider 进行认证.那到底 UsernamePasswordAuthenticationToken 由supports方法来决定的。

5)UserDetailsService获取用户信息

UserDetailsService 获取的对象是一个 UserDetails。

6)认证结果处理

如果认证成功(用户名,密码完全正确), AuthenticationProvider 将会返回一个完全有效的 Authentication 对象(UsernamePasswordAuthenticationToken). 否则抛出 AuthenticationException 异常。


4、sso单点登录流程

假设项目现在有认证中心、子系统A、子系统B三个系统:

1)用户未登录直接访问子系统A时,由于子系统A的localStorage未存储有token,前端直接通过浏览器重定向至认证中心的验权接口去校验用户是否登录,并在url上拼接子系统A的唯一标识码systemID,用于认证中心登录或校验成功后重定向回子系统A。

2)重定向到认证中心后,认证中心的校验接口尝试获取token,由于用户并未登录,因此认证中心的cookie中未存储token值,校验不通过,因此校验接口重定向至认证中心的登录页面并带上子系统A的systemID。

3)用户在登录页面登录成功后,生成token并存储到认证中心的cookie中,然后登录接口通过systemID获取子系统A的页面地址(存储在数据库中),将token拼接在url上并重定向到子系统A。

4)子系统A的前端接收到认证中心的重定向请求并获取到url上的token值,将token值存储到localStorage,至此完成子系统A的单点登录。

5)用户登录成功后直接访问子系统B,此时子系统B的localStorage未存储token,前端直接通过浏览器重定向至认证中心的验权接口去校验用户是否登录,并在url上拼接子系统B的唯一标识码systemID,用于认证中心登录或校验成功后重定向回子系统B。

6)认证中心校验接口尝试获取cookie中的token,由于前面用户已经登录成功,cookie中已存在token,因此校验接口判断用户已经登录,通过systemID重定向回子系统B,并在url上拼接上token。

7)子系统B的前端接收到认证中心的重定向请求并获取到url上的token值,将token值存储到localStorage,至此完成子系统B的单点登录。

5、问题

搭项目时遇到两个问题,现记录如下:

1)保存token到cookie和获取cookie中的token失败,由于子系统和认证中心之间是跨域请求,因此无法对cookie进行操作,这里使用nginx反向代理来实现对cookie的操作(也就是所谓的欺骗浏览器)。

2)后台重定向失败,这点和前端大佬排查了很久,最后发现是由于前端请求后台的接口时使用的是ajax,导致后台无法重定向,页面跳转失败;因此前端改用location.hrefc请求接口(即浏览器地址栏请求),从而解决上述问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容