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