业务场景
使用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();
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END