Spring Boot 在方法内调用Oauth2登录接口

1,815 阅读1分钟

业务场景

使用Spring Security Oauth2作为系统的登录方案

但需要对登录过程和返回结果进行特殊化处理, 例如:

  • 记录最后登录事件
  • 在返回内容中增加用户信息

经过思考后, 笔者决定自己创建一个新的登录接口, 并在其中调用Oauth2的'/oauth/token'

方案

创建Oauth2工具类

建立一个工具类用于在内部调用其接口进行登录, Oauth2Util.java:

@Component
public class Oauth2Util {

    /**
   * 登录
   *
   * @param url          登录地址
   * @param clientId     客户端id
   * @param clientSecret 客户端密钥
   * @param username     用户名
   * @param password     密码
   * @return 登录结果
   */
    public static OAuth2AccessToken login(String url, String clientId, String clientSecret, String username, String password) {
        ResourceOwnerPasswordResourceDetails resourceDetails = new ResourceOwnerPasswordResourceDetails();
        resourceDetails.setAccessTokenUri(url);
        resourceDetails.setClientId(clientId);
        resourceDetails.setClientSecret(clientSecret);
        resourceDetails.setUsername(username);
        resourceDetails.setPassword(password);
        OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails);
        restTemplate.setAccessTokenProvider(new ResourceOwnerPasswordAccessTokenProvider());
        return restTemplate.getAccessToken();
    }

}

创建新的登录方法

LoginApiImpl.java:

@RestController
@Data
@AllArgsConstructor
public class LoginApiImpl implements LoginApi {

    // 登录接口地址
    private static final String OAUTH_URL = "http://localhost:9999/oauth/token"
    
    private final UserService userService;

    @Override
    public LoginResult login(User user) {
        // 请求登录接口获取token
        OAuth2AccessToken token = Oauth2Util.login(OAUTH_URL, "vue", "vue", user.getUsername(), user.getPassword());
        // 设置并更新最后登录时间
        user.setLastLoginTime(new Date());
        userService.update(user);
        return LoginResult.builder().token(token).user(user).build();
    }

}