V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
FormatToday
V2EX  ›  Java

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

  •  
  •   FormatToday ·
    FormatToday · 2023-05-29 15:46:35 +08:00 · 2185 次点击
    这是一个创建于 577 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    spring 默认的 UsernamePasswordAuthenticationFilter 、UsernamePasswordAuthenticationToken 直接 copy 改一份,照着配置就好了。
    JohnYehyo
        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 返回
    siweipancc
        16
    siweipancc  
       2023-06-05 12:05:47 +08:00 via iPhone
    官方教程有 demo ,看不懂英文我就没办法了,估计你在 csdn 上找到正确方案的时间花费比从 0 学英语还久
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2969 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:10 · PVG 22:10 · LAX 06:10 · JFK 09:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.