菜鸟求指教。Spring Security 如何指定某个用户登录成功

2023-05-29 15:46:35 +08:00
 FormatToday

本来项目有账号密码登录,现在搞小程序登录,使用小程序获取用户手机号,如果库里有这个手机号,直接给他登录了,返回 token 。 现在是已经获取到了用户手机号,怎么在 Spring Security 中去指定这个用户是已登录状态,从而获取到 token 。

2185 次点击
所在节点    Java
16 条回复
workOrNot
2023-05-29 15:48:32 +08:00
把你登陆接口的代码复用一下 不就好了吗
lyusantu
2023-05-29 15:53:01 +08:00
你帮他登录一下不就好了
lyusantu
2023-05-29 15:53:38 +08:00
@lyusantu #2 我的意思是,已经获取到了手机号,你直接隐式替他实现登录然后返回 token 给小程序的获取用户手机号的接口
Red998
2023-05-29 15:54:38 +08:00
模拟登陆下、把接口过滤下
FormatToday
2023-05-29 15:55:05 +08:00
@lyusantu #3 现在就是不知道怎么去替他登录,是取他的密码再去调用一下原来的登录接口吗?
FormatToday
2023-05-29 15:56:22 +08:00
@Red998 现在就是不知道怎么去替他登录,是取他的密码再去调用一下原来的登录接口吗?
iceg
2023-05-29 16:04:19 +08:00
org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.postAccessToken
org.springframework.security.oauth2.provider.password.getOAuth2Authentication
参考这两个方法?
xuanbg
2023-05-29 16:05:44 +08:00
OP 你这个其实就是变相的微信授权登录。要先获取微信的用户信息,拿到用户信息里面的手机号,然后查数据库。查到手机号就按正常的流程发一个 token 就行了。
XE2VA
2023-05-29 16:08:48 +08:00
@xuanbg 对,就是这种方式,具体的就是根据用户信息创建 UsernamePasswordAuthenticationToken 对象,放到 Security 上下文中。
FormatToday
2023-05-29 16:23:57 +08:00
@xuanbg
@XE2VA
请问一下,是不是就新建个 AuthenticationToken 对象放到 Security 上下文里,这个用户就已经是登录的状态了呀
lyusantu
2023-05-29 16:28:43 +08:00
@FormatToday #10 ...密码明文你才能取他的密码替他登录,前提是明文,非明文的话,手机号应该也是具备唯一性的?如果具备唯一性,直接单独一个业务使用手机号查询用户信息,然后按照你正常登录的业务流程生成 token 返回就行了
kevinonepiece
2023-05-29 17:33:15 +08:00
弄个超级密码,继承 BCryptPasswordEncoder ,重写 match 方法,如果是超级密码,就返回 true 。然后微信登录就手机号和超级号码去登录
Bingchunmoli
2023-05-29 20:53:20 +08:00
@FormatToday 放入一个经过验证的 token 对象即可,或者拦截器直接返回 token 也行,文档有写的
mmdsun
2023-05-30 00:10:08 +08:00
先看看基础,学习下吧。
你原先项目密码登录用的是 spring security 吗?

那你照着旧代码改个,用小程序 openID 登录的不是就可以了么?

只是一个是用户名+密码查数据库用户,一个是 openID 查数据库罢了。

spring 默认的 UsernamePasswordAuthenticationFilter 、UsernamePasswordAuthenticationToken 直接 copy 改一份,照着配置就好了。
JohnYehyo
2023-05-30 14:13:25 +08:00
```
private LoginUser refreshAuth(String userName) {
LoginUser loginUser = (LoginUser) userDetailsService.loadUserByUsername(userName);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(ServletUtils.getRequest()));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
return loginUser;
}
```
然后用这个用户信息创建你的 token 返回
siweipancc
2023-06-05 12:05:47 +08:00
官方教程有 demo ,看不懂英文我就没办法了,估计你在 csdn 上找到正确方案的时间花费比从 0 学英语还久

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/943917

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX