最近在学习做单点登录,用的是 spring security oauth2 那套东西。 用的 jwt token,子系统客户端使用 EnableOAuth2Sso 注解。 现在已经实现了单点登录的功能,但是我想在子系统获取当前登录用户的信息,比如 token,然后解析 token,将用户部分信息存到数据库管理。该如何实现呢 因为在浏览器中都是通过点击登录就直接跳转到子系统内部了,所以不清楚 token 是在什么地方获取,或者能不能获取?

最近在学习做单点登录,用的是 spring security oauth2 那套东西。 用的 jwt token,子系统客户端使用 EnableOAuth2Sso 注解。 现在已经实现了单点登录的功能,但是我想在子系统获取当前登录用户的信息,比如 token,然后解析 token,将用户部分信息存到数据库管理。该如何实现呢 因为在浏览器中都是通过点击登录就直接跳转到子系统内部了,所以不清楚 token 是在什么地方获取,或者能不能获取?
1 securityCoding Sep 1, 2020 考虑一下子系统统一走网关, 在网关解析登录态? |
2 ksice Sep 1, 2020 统一共用一套认证系统不就能取到用户信息? |
3 hotpot6147 Sep 1, 2020 要么在 header 里面要么在 query string 里面 |
4 Blueming OP @ksice 就是用的一个认证系统,但是全都在浏览器用户点击完成了,不是那种直接用 postman 调用接口返回 token,我就不知道到底该在哪里找到认证系统给我颁发的 token |
5 Blueming OP @hotpot6147 我看了下浏览器的记录,是直接先申请授权码然后 302 重定向到申请 token 最后又 302 重定向到子系统的 login,都没有见到 token 的影子 |
6 Nich0la5 Sep 1, 2020 via Android 获取认证 token 是两个服务器之间的通信,浏览器当然看不见 |
8 JellyDong Sep 1, 2020 .NET Core 中有个 Identity Server4 的东西,其它语言的程序也是可以接入的,不知道 Java 有没有类似的 |
10 enchigo Sep 1, 2020 spring security oauth2 用起来有那么一丝不顺手 网上资料很多,但是大多都不准确。我这边项目没用 JWT,直接用的 Bearer Token,access_token 也是自己从 RequestContext 里面拿。用户信息的话是通过 SecurityContextHolder 取的,然而 OAuth2Authentication 貌似是私有构造,所以还得用非严格模式的 jackson 序列化和反序列化一次拿到对象,再从中拿到 UserDetail 。我也不知道合不合规,反正就这样做了。 |
13 jorneyr Sep 1, 2020 这个好像不是 OAuth2 的功能,而是 SSO 的功能 |
15 canbingzt Sep 1, 2020 Spring Security OAuth 2.x 已经被标记 deprecated,所有 Spring Security OAuth 2.x 内容( Clients 和 Resource Servers )将迁移到 Spring Security 5.2.x,但是 Spring Security 并不提供 Authorization Server,可能需要第三方的组件来提供支持(比如 Keycloak 、cas 等) 参考 https://github.com/spring-projects/spring-security/wiki/OAuth-2.0-Migration-Guide |
19 ErrorMan Sep 2, 2020 翻了下以前的代码,以前的文档是 Authorize Server 开启时提供了一个 /me 入口,子系统拿到 JWT token 之后带着这个 token 去访问 /me, 可以拿到 UserDetail 的 JSON 回复。所以我的实现是用 feign 对 Authorize Server 开一个 rpc 请求,而且 feign 请求时会自动携带 JWT token,所以获取过程就变成了调用 feign 的 rpc 拿到和 Authorize Server 定义相同的 UserDetail 然后继续。 看了 append 感觉我的方法已经过时了啊。还有楼上老哥说的被 deprecate 了 |