快速实现SSO—单点登录
Posted 潜谈Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速实现SSO—单点登录相关的知识,希望对你有一定的参考价值。
当你以为那些曾经风光无限的人终于待到虎落平阳的时候,请认清现实,他们已经拥有了”虎“的本质。
写在前面
单点登录(Single Sign On)简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。当用户第一次访问应用系统的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的令牌——token;用户再访问别的应用的时候,就会将这个token带上,作为自己认证的凭据,应用系统接受到请求之后会把token送到认证系统进行校验,检查令牌的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。
传统登录流程
前端传入用户名、密码及验证码等信息,后端拿到请求参数时,第一步校验当前用户是否存在,如果存在,则开始校验当前用户名对应的密码是否合法,如果校验不通过返回错误码;如果校验通过则将当前登录成功的用户信息放进session对象中,只要用户在session有效期内再次访问应用,只需获取存储在session对象中的用户数据进行比较,比对成功直接放行,否则跳转登录链接让用户重新登录。
session在登录流程中的作用:
可以自动生产令牌(jsessionid);
可以采用map数据结构存储用户信息;
可以设置有效期,以Tomcat服务器为例,session会话默认是30分钟失效。
经过传统方式的登录流程分析得出:如果允许用户进行多端登录且只需登录一次即可访问多个关联的应用系统,并且在session有效期内再次访问应用系统,则无需登录直接放行。这时我们只需解决session分离的问题,那么SSO的实现近在咫尺。
Redis实现方案
使用Redis内存数据库模拟session的管理机制。为什么使用Redis?首先对于存储用户信息方面——它有5种灵活的数据结构,其次对于session的有效期——它也提供了很完美的API,何乐而不为呢?
SpringMVC实现方案
自定义安全校验拦截器实现SSO单点登录,各位都清楚,拦截器都是在controller函数被调用前后实施校验过程,那么单点登录的校验无疑就是在所有请求前进行用户身份的拦截校验。
我们只需在用户登录时给用户下发一个唯一token,如果当前用户是第一次登录应用系统则创建token并下发给client,否则刷新用户携带的token;后续的访问都应该校验用户携带的token信息是否合法才可放行,那么校验用户的token信息我们就可以借助springMVC的拦截器帮助我们实现单点登录。
如何自定义安全校验拦截器?
1、实现HandlerInterceptor接口和继承HandlerInterceptorAdapter抽象类,然后复写preHandle、postHandle和afterCompletion三个方法。
preHandle方法:该方法在请求处理之前进行调用。SpringMVC 中的 Interceptor 是链式调用的,在一个应用中或者说是在一个请求中可以同时存在多个 Interceptor 。每个 Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是 Interceptor 中的 preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求做一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值 Boolean 类型的,当它返回为 false 时,表示请求结束,后续的 Interceptor 和 Controller 都不会再执行;当返回值为 true 时,就会继续调用下一个 Interceptor 的 preHandle 方法,如果已经是最后一个 Interceptor 的时候,就会是调用当前请求的 Controller 中的方法。
postHandle方法:该方法在当前请求进行处理之后,也就是在 Controller 中的方法调用之后执行,但是它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以咱们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作。postHandle 方法被调用的方向跟 preHandle 是相反的,也就是说,先声明的 Interceptor 的 postHandle 方法反而会后执行。这和 Struts2 里面的 Interceptor 的执行过程有点类型,Struts2 里面的 Interceptor 的执行过程也是链式的,只是在 Struts2 里面需要手动调用 ActionInvocation 的 invoke 方法来触发对下一个 Interceptor 或者是 action 的调用,然后每一个 Interceptor 中在 invoke 方法调用之前的内容都是按照声明顺序执行的,而 invoke 方法之后的内容就是反向的。
afterCompletion方法:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间, 还可以进行一些资源清理。
2、在springmvc配置文件中配置自定义安全校验拦截器。
以上是关于快速实现SSO—单点登录的主要内容,如果未能解决你的问题,请参考以下文章