84 lines
3.3 KiB
Java
84 lines
3.3 KiB
Java
|
package com.ruoyi.webApi;
|
||
|
|
||
|
import com.ruoyi.common.constant.Constants;
|
||
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||
|
import com.ruoyi.common.core.domain.model.LoginBody;
|
||
|
import com.ruoyi.common.core.domain.model.LoginUser;
|
||
|
import com.ruoyi.common.exception.ServiceException;
|
||
|
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
|
||
|
import com.ruoyi.common.utils.MessageUtils;
|
||
|
import com.ruoyi.framework.manager.AsyncManager;
|
||
|
import com.ruoyi.framework.manager.factory.AsyncFactory;
|
||
|
import com.ruoyi.framework.security.context.AuthenticationContextHolder;
|
||
|
import com.ruoyi.framework.web.service.SysLoginService;
|
||
|
import com.ruoyi.framework.web.service.TokenService;
|
||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||
|
import org.springframework.security.authentication.AuthenticationManager;
|
||
|
import org.springframework.security.authentication.BadCredentialsException;
|
||
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||
|
import org.springframework.security.core.Authentication;
|
||
|
import org.springframework.web.bind.annotation.*;
|
||
|
|
||
|
import javax.annotation.Resource;
|
||
|
import java.io.IOException;
|
||
|
|
||
|
/**
|
||
|
* @author 16358
|
||
|
* @date 2025/6/3
|
||
|
*/
|
||
|
@RequestMapping("/openApi")
|
||
|
@RestController
|
||
|
public class ApiController {
|
||
|
|
||
|
@Autowired
|
||
|
private SysLoginService sysLoginService;
|
||
|
|
||
|
@Autowired
|
||
|
private TokenService tokenService;
|
||
|
|
||
|
@Resource
|
||
|
private AuthenticationManager authenticationManager;
|
||
|
|
||
|
//对外提供登录接口
|
||
|
@PostMapping("/getToken")
|
||
|
public AjaxResult getToken(@RequestBody LoginBody loginBody) throws IOException {
|
||
|
String username = loginBody.getUsername();
|
||
|
String password = loginBody.getPassword();
|
||
|
AjaxResult ajax = AjaxResult.success();
|
||
|
//登录前校验
|
||
|
sysLoginService.loginPreCheck(username, password);
|
||
|
// 用户验证
|
||
|
Authentication authentication = null;
|
||
|
try
|
||
|
{
|
||
|
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
|
||
|
AuthenticationContextHolder.setContext(authenticationToken);
|
||
|
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
|
||
|
authentication = authenticationManager.authenticate(authenticationToken);
|
||
|
}
|
||
|
catch (Exception e)
|
||
|
{
|
||
|
if (e instanceof BadCredentialsException)
|
||
|
{
|
||
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
|
||
|
throw new UserPasswordNotMatchException();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
|
||
|
throw new ServiceException(e.getMessage());
|
||
|
}
|
||
|
}
|
||
|
finally
|
||
|
{
|
||
|
AuthenticationContextHolder.clearContext();
|
||
|
}
|
||
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
|
||
|
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
|
||
|
sysLoginService.recordLoginInfo(loginUser.getUserId());
|
||
|
// 生成token
|
||
|
String token = tokenService.createToken(loginUser);
|
||
|
ajax.put(Constants.TOKEN, token);
|
||
|
return ajax;
|
||
|
}
|
||
|
}
|