1
sfwn 2017-09-09 12:25:17 +08:00 via Android 1
redis key 可以设置超时时间
|
2
yidinghe 2017-09-09 12:34:43 +08:00 via Android 1
用其他 cookie 来代替缺省的 session,超时时间直接设在 redis 里,浏览器设置超时 30 天。也就是说,浏览器提交的 sessionid 一旦 redis 查不到,就要求重新登录,登录成功后
|
3
yidinghe 2017-09-09 12:35:33 +08:00 via Android 1
(手滑)登录成功后同时往浏览器和 redis 记录新的 sessionid 即可。
|
4
caixiexin 2017-09-09 12:36:43 +08:00 1
可以尝试另一个思路:
CAS 认证完成后,由应用自己管理 session,应用预留登出接口,接受 CAS 统一登出的通知。然后应用的 Session 时长,爱多久就多久,放在 redis 里可以设置 redis 的缓存 expire 时间。 这样有个好处是,CAS 只作为认证服务器,不管理会话,CAS 哪天挂了,也不会影响已经登录的用户。 |
5
hantsy 2017-09-09 14:54:43 +08:00 1
扔掉 CAS 吧。
Spring 官方子项目,Spring Session 支持 JDBC, Redis, Hazacast,Mongo 等,实现了 Servlet Session API, 通过 Servlet Wrapper(HttpRequestWrapper, HttpReponseWrapper) 接口运行替换了 Servlet Session, 所有 Servlet Session Event 都是自动支持。超时配置一下就行了,在 Spring Boot 在配置文件也可以设置。 Spring Session+Redis 已经应用多年,WEB, REST APIs 全部适合。一般来讲,传统 WEB 用 Cookie,REST 用 X-Auth-Token 完成 Authentication。 REST 使用例子: https://github.com/hantsy/spring-microservice-sample 看 Readme 文档。 |
6
vivaldi OP @hantsy 谢谢,扔掉 CAS 代价有点大,不过我用 Spring Session 代替了之前得 redis session 共享方案,并且替换掉了由 Tomcat 来管理 session,这样在我们项目中需要的改动比较小。替换 CAS 首先领导那里就比较难过,其次还是需要一些工作量。
|
7
vivaldi OP @caixiexin 感谢分享,很好的思路,比我们现在灵活多了,后面考虑能不能改成这种模式,现在我已经先用 Spring Session 给实现掉了,毕竟面向 deadline 编程 :)
|
8
hantsy 2017-09-09 20:55:34 +08:00 1
@vivaldi
代价真的不大。 用一个单独的 Auth 服务作安全认证(带 Login 界面),其它应用如果 Authentication Failed,返回 /login 时, 直接 Redirect (带上返回应用地址 Url )到 Auth 登录界面, 登录成功后,Redirected 到之前要返回的应用 Url (带上 Token, 即 Session ID,当然你可以加密) 返回到应用界面,所在的应用加一个 Filter 解析一下这个返回的 Token,设置 Cookie 即可,大功告成。 至于超时设置 Spring Session 很容易,另外 Session 在 Redis 中,你想怎么管理都行,暴露到管理界面,随时可以删除(踢掉)哪个连接的 Session。 另外,Spring Cloud Security 用 OAuth 2 可以完成这个 SSO 过程, 一个 @EnableOAuth2Sso 可以搞定了。看官方教程 https://spring.io/guides/tutorials/spring-security-and-angular-js/ 当然,我个人项目已经好几年没用传统 MVC,上次使用 CAS 已经是好久的事情(我基本没印象了),现在只使用 REST APIs (可能+Websocket ) 与外部交互,SSO 显然已经不重要了。 |