@@ -0,0 +1,67 @@ | |||||
package com.ningdatech.pmapi.user.controller; | |||||
import com.ningdatech.log.model.OptLogDTO; | |||||
import com.ningdatech.log.model.enumeration.LogType; | |||||
import com.ningdatech.log.service.OptLogService; | |||||
import com.ningdatech.log.util.AddressUtil; | |||||
import com.ningdatech.pmapi.user.security.auth.model.UserInfoDetails; | |||||
import com.ningdatech.pmapi.user.security.auth.model.WebRequestDetails; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.springframework.context.event.EventListener; | |||||
import org.springframework.scheduling.annotation.Async; | |||||
import org.springframework.security.authentication.event.AbstractAuthenticationEvent; | |||||
import org.springframework.security.authentication.event.AuthenticationSuccessEvent; | |||||
import org.springframework.security.authentication.event.LogoutSuccessEvent; | |||||
import org.springframework.security.core.Authentication; | |||||
import org.springframework.stereotype.Component; | |||||
import java.time.LocalDateTime; | |||||
/** | |||||
* <p> | |||||
* AuthorizationEventListener | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023/6/7 | |||||
**/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class AuthorizationEventListener { | |||||
private final OptLogService optLogService; | |||||
@Async | |||||
@EventListener(AuthenticationSuccessEvent.class) | |||||
public void loginSuccessListener(AuthenticationSuccessEvent event) { | |||||
optLogService.save(buildOptLog("用户登录", event)); | |||||
} | |||||
@Async | |||||
@EventListener(LogoutSuccessEvent.class) | |||||
public void logoutSuccessListener(LogoutSuccessEvent event) { | |||||
optLogService.save(buildOptLog("退出登录", event)); | |||||
} | |||||
private OptLogDTO buildOptLog(String description, AbstractAuthenticationEvent event) { | |||||
Authentication authentication = event.getAuthentication(); | |||||
UserInfoDetails userDetails = (UserInfoDetails) authentication.getPrincipal(); | |||||
WebRequestDetails webDetails = (WebRequestDetails) authentication.getDetails(); | |||||
OptLogDTO log = new OptLogDTO(); | |||||
log.setActionMethod(webDetails.getServletPath()); | |||||
log.setDescription(description); | |||||
log.setStartTime(LocalDateTime.now()); | |||||
log.setFinishTime(log.getStartTime()); | |||||
log.setCreateOn(log.getStartTime()); | |||||
log.setHttpMethod(webDetails.getMethod()); | |||||
log.setUserName(userDetails.getUsername()); | |||||
log.setCreateBy(userDetails.getUserId()); | |||||
log.setRequestIp(webDetails.getRequestIp()); | |||||
log.setRequestUri(webDetails.getRequestUri()); | |||||
log.setRegionByIp(AddressUtil.getRegion(log.getRequestIp())); | |||||
log.setUa(webDetails.getUserAgent()); | |||||
log.setType(LogType.OPT.name()); | |||||
return log; | |||||
} | |||||
} |
@@ -1,6 +1,7 @@ | |||||
package com.ningdatech.pmapi.user.security.auth.agent; | package com.ningdatech.pmapi.user.security.auth.agent; | ||||
import com.ningdatech.basic.exception.BizException; | import com.ningdatech.basic.exception.BizException; | ||||
import com.ningdatech.pmapi.user.security.auth.model.WebRequestDetails; | |||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.springframework.http.HttpMethod; | import org.springframework.http.HttpMethod; | ||||
import org.springframework.security.authentication.AuthenticationServiceException; | import org.springframework.security.authentication.AuthenticationServiceException; | ||||
@@ -49,8 +50,7 @@ public class AgentAuthFilter extends AbstractAuthenticationProcessingFilter { | |||||
userId = trim(userId); | userId = trim(userId); | ||||
try { | try { | ||||
AgentAuthToken authRequest = new AgentAuthToken(userId, userId); | AgentAuthToken authRequest = new AgentAuthToken(userId, userId); | ||||
// Allow subclasses to set the "details" property | |||||
setDetails(request, authRequest); | |||||
authRequest.setDetails(new WebRequestDetails(request)); | |||||
return this.getAuthenticationManager().authenticate(authRequest); | return this.getAuthenticationManager().authenticate(authRequest); | ||||
} catch (AuthenticationException e) { | } catch (AuthenticationException e) { | ||||
throw new BadCredentialsException("用户id 不能为空"); | throw new BadCredentialsException("用户id 不能为空"); | ||||
@@ -61,10 +61,6 @@ public class AgentAuthFilter extends AbstractAuthenticationProcessingFilter { | |||||
} | } | ||||
} | } | ||||
protected void setDetails(HttpServletRequest request, AgentAuthToken authRequest) { | |||||
authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); | |||||
} | |||||
private String trim(String trimStr) { | private String trim(String trimStr) { | ||||
if (StringUtils.isNotBlank(trimStr)) { | if (StringUtils.isNotBlank(trimStr)) { | ||||
return trimStr.trim(); | return trimStr.trim(); | ||||
@@ -1,6 +1,7 @@ | |||||
package com.ningdatech.pmapi.user.security.auth.common; | package com.ningdatech.pmapi.user.security.auth.common; | ||||
import com.ningdatech.basic.exception.BizException; | import com.ningdatech.basic.exception.BizException; | ||||
import com.ningdatech.pmapi.user.security.auth.model.WebRequestDetails; | |||||
import com.ningdatech.pmapi.user.security.auth.validate.CommonLoginException; | import com.ningdatech.pmapi.user.security.auth.validate.CommonLoginException; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.springframework.http.HttpMethod; | import org.springframework.http.HttpMethod; | ||||
@@ -55,8 +56,8 @@ public class CommonAuthFilter extends AbstractAuthenticationProcessingFilter { | |||||
platform = trim(platform); | platform = trim(platform); | ||||
credential = trim(credential); | credential = trim(credential); | ||||
try { | try { | ||||
CommonAuthToken authRequest = new CommonAuthToken(platform,credential); | |||||
setDetails(request, authRequest); | |||||
CommonAuthToken authRequest = new CommonAuthToken(platform, credential); | |||||
authRequest.setDetails(new WebRequestDetails(request)); | |||||
return this.getAuthenticationManager().authenticate(authRequest); | return this.getAuthenticationManager().authenticate(authRequest); | ||||
} catch (AuthenticationException e) { | } catch (AuthenticationException e) { | ||||
throw new BadCredentialsException("用户状态"); | throw new BadCredentialsException("用户状态"); | ||||
@@ -67,10 +68,6 @@ public class CommonAuthFilter extends AbstractAuthenticationProcessingFilter { | |||||
} | } | ||||
} | } | ||||
protected void setDetails(HttpServletRequest request, CommonAuthToken authRequest) { | |||||
authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); | |||||
} | |||||
private String trim(String trimStr) { | private String trim(String trimStr) { | ||||
if (StringUtils.isNotBlank(trimStr)) { | if (StringUtils.isNotBlank(trimStr)) { | ||||
return trimStr.trim(); | return trimStr.trim(); | ||||
@@ -2,6 +2,7 @@ package com.ningdatech.pmapi.user.security.auth.credential; | |||||
import com.ningdatech.basic.exception.BizException; | import com.ningdatech.basic.exception.BizException; | ||||
import com.ningdatech.pmapi.user.constant.LoginTypeEnum; | import com.ningdatech.pmapi.user.constant.LoginTypeEnum; | ||||
import com.ningdatech.pmapi.user.security.auth.model.WebRequestDetails; | |||||
import com.ningdatech.pmapi.user.security.auth.validate.CommonLoginException; | import com.ningdatech.pmapi.user.security.auth.validate.CommonLoginException; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.springframework.http.HttpMethod; | import org.springframework.http.HttpMethod; | ||||
@@ -59,17 +60,14 @@ public class CredentialAuthFilter extends AbstractAuthenticationProcessingFilter | |||||
loginType = trim(loginType); | loginType = trim(loginType); | ||||
try { | try { | ||||
CredentialAuthToken authRequest = new CredentialAuthToken(identifier, credential, loginType); | CredentialAuthToken authRequest = new CredentialAuthToken(identifier, credential, loginType); | ||||
// Allow subclasses to set the "details" property | |||||
setDetails(request, authRequest); | |||||
authRequest.setDetails(new WebRequestDetails(request)); | |||||
return this.getAuthenticationManager().authenticate(authRequest); | return this.getAuthenticationManager().authenticate(authRequest); | ||||
} catch (CommonLoginException e) { | } catch (CommonLoginException e) { | ||||
throw new CommonLoginException(e.getMessage()); | throw new CommonLoginException(e.getMessage()); | ||||
} catch (BadCredentialsException e) { | |||||
} catch (BadCredentialsException | BizException e) { | |||||
throw new BadCredentialsException(e.getMessage()); | throw new BadCredentialsException(e.getMessage()); | ||||
} catch (AuthenticationException e) { | } catch (AuthenticationException e) { | ||||
throw new BadCredentialsException("账号或密码错误"); | throw new BadCredentialsException("账号或密码错误"); | ||||
} catch (BizException e) { | |||||
throw new BadCredentialsException(e.getMessage()); | |||||
} catch (Exception e) { | } catch (Exception e) { | ||||
throw new InternalAuthenticationServiceException("授权失败:", e); | throw new InternalAuthenticationServiceException("授权失败:", e); | ||||
} | } | ||||
@@ -0,0 +1,73 @@ | |||||
package com.ningdatech.pmapi.user.security.auth.model; | |||||
import cn.hutool.core.util.StrUtil; | |||||
import cn.hutool.extra.servlet.ServletUtil; | |||||
import org.springframework.security.web.authentication.WebAuthenticationDetails; | |||||
import javax.servlet.http.HttpServletRequest; | |||||
/** | |||||
* <p> | |||||
* WebRequestDetails | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 2023/6/7 | |||||
**/ | |||||
public class WebRequestDetails extends WebAuthenticationDetails { | |||||
private static final long serialVersionUID = -4466339683132696235L; | |||||
private final String requestIp; | |||||
private final String requestUri; | |||||
private final String method; | |||||
private final String servletPath; | |||||
private final String requestUrl; | |||||
private final String userAgent; | |||||
/** | |||||
* Records the remote address and will also set the session Id if a session already | |||||
* exists (it won't create one). | |||||
* | |||||
* @param request that the authentication request was received from | |||||
*/ | |||||
public WebRequestDetails(HttpServletRequest request) { | |||||
super(request); | |||||
this.requestUri = request.getRequestURI(); | |||||
this.method = request.getMethod(); | |||||
this.servletPath = request.getServletPath(); | |||||
this.requestUrl = request.getRequestURL().toString(); | |||||
this.requestIp = ServletUtil.getClientIP(request); | |||||
this.userAgent = StrUtil.sub(request.getHeader("user-agent"), 0, 500); | |||||
} | |||||
public String getRequestIp() { | |||||
return requestIp; | |||||
} | |||||
public String getRequestUri() { | |||||
return requestUri; | |||||
} | |||||
public String getMethod() { | |||||
return method; | |||||
} | |||||
public String getServletPath() { | |||||
return servletPath; | |||||
} | |||||
public String getRequestUrl() { | |||||
return requestUrl; | |||||
} | |||||
public String getUserAgent() { | |||||
return userAgent; | |||||
} | |||||
} |