本来项目有账号密码登录,现在搞小程序登录,使用小程序获取用户手机号,如果库里有这个手机号,直接给他登录了,返回 token 。 现在是已经获取到了用户手机号,怎么在 Spring Security 中去指定这个用户是已登录状态,从而获取到 token 。
1
workOrNot 2023-05-29 15:48:32 +08:00
把你登陆接口的代码复用一下 不就好了吗
|
2
lyusantu 2023-05-29 15:53:01 +08:00
你帮他登录一下不就好了
|
3
lyusantu 2023-05-29 15:53:38 +08:00
@lyusantu #2 我的意思是,已经获取到了手机号,你直接隐式替他实现登录然后返回 token 给小程序的获取用户手机号的接口
|
4
Red998 2023-05-29 15:54:38 +08:00
模拟登陆下、把接口过滤下
|
5
FormatToday OP @lyusantu #3 现在就是不知道怎么去替他登录,是取他的密码再去调用一下原来的登录接口吗?
|
6
FormatToday OP @Red998 现在就是不知道怎么去替他登录,是取他的密码再去调用一下原来的登录接口吗?
|
7
iceg 2023-05-29 16:04:19 +08:00
org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.postAccessToken
org.springframework.security.oauth2.provider.password.getOAuth2Authentication 参考这两个方法? |
8
xuanbg 2023-05-29 16:05:44 +08:00
OP 你这个其实就是变相的微信授权登录。要先获取微信的用户信息,拿到用户信息里面的手机号,然后查数据库。查到手机号就按正常的流程发一个 token 就行了。
|
9
XE2VA 2023-05-29 16:08:48 +08:00
@xuanbg 对,就是这种方式,具体的就是根据用户信息创建 UsernamePasswordAuthenticationToken 对象,放到 Security 上下文中。
|
10
FormatToday OP |
11
lyusantu 2023-05-29 16:28:43 +08:00
@FormatToday #10 ...密码明文你才能取他的密码替他登录,前提是明文,非明文的话,手机号应该也是具备唯一性的?如果具备唯一性,直接单独一个业务使用手机号查询用户信息,然后按照你正常登录的业务流程生成 token 返回就行了
|
12
kevinonepiece 2023-05-29 17:33:15 +08:00
弄个超级密码,继承 BCryptPasswordEncoder ,重写 match 方法,如果是超级密码,就返回 true 。然后微信登录就手机号和超级号码去登录
|
13
Bingchunmoli 2023-05-29 20:53:20 +08:00 via Android
@FormatToday 放入一个经过验证的 token 对象即可,或者拦截器直接返回 token 也行,文档有写的
|
14
mmdsun 2023-05-30 00:10:08 +08:00 via iPhone
先看看基础,学习下吧。
你原先项目密码登录用的是 spring security 吗? 那你照着旧代码改个,用小程序 openID 登录的不是就可以了么? 只是一个是用户名+密码查数据库用户,一个是 openID 查数据库罢了。 spring 默认的 UsernamePasswordAuthenticationFilter 、UsernamePasswordAuthenticationToken 直接 copy 改一份,照着配置就好了。 |
15
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 返回 |
16
siweipancc 2023-06-05 12:05:47 +08:00 via iPhone
官方教程有 demo ,看不懂英文我就没办法了,估计你在 csdn 上找到正确方案的时间花费比从 0 学英语还久
|