package com.mindskip.xzs.configuration.spring.security;
|
|
import cn.hutool.crypto.asymmetric.KeyType;
|
import cn.hutool.crypto.asymmetric.RSA;
|
import com.mindskip.xzs.configuration.property.CookieConfig;
|
|
import com.mindskip.xzs.utility.JsonUtil;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
import org.springframework.security.core.Authentication;
|
import org.springframework.security.core.AuthenticationException;
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
|
import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
import java.io.InputStream;
|
|
/**
|
* @version 2.2.0
|
* @description: 登录参数序列化
|
* Copyright (C), 2020-2021, 武汉思维跳跃科技有限公司
|
* @date 2021 /9/7 9:45
|
*/
|
public class RestLoginAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
|
private final org.slf4j.Logger logger = LoggerFactory.getLogger(RestLoginAuthenticationFilter.class);
|
private final RSA rsa;
|
|
public RestLoginAuthenticationFilter(RSA rsa) {
|
super(new AntPathRequestMatcher("/api/user/login", "POST"));
|
this.rsa = rsa;
|
}
|
|
@Override
|
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
|
UsernamePasswordAuthenticationToken authRequest;
|
try (InputStream is = request.getInputStream()) {
|
AuthenticationBean authenticationBean = JsonUtil.toJsonObject(is, AuthenticationBean.class);
|
authenticationBean.setPassword(rsa.decryptStr(authenticationBean.getPassword(), KeyType.PrivateKey));
|
request.setAttribute(TokenBasedRememberMeServices.DEFAULT_PARAMETER, authenticationBean.isRemember());
|
authRequest = new UsernamePasswordAuthenticationToken(authenticationBean.getUserName(), authenticationBean.getPassword());
|
} catch (IOException e) {
|
logger.error(e.getMessage(), e);
|
authRequest = new UsernamePasswordAuthenticationToken("", "");
|
}
|
setDetails(request, authRequest);
|
return this.getAuthenticationManager().authenticate(authRequest);
|
|
}
|
|
public void setUserDetailsService(UserDetailsService userDetailsService) {
|
RestTokenBasedRememberMeServices tokenBasedRememberMeServices = new RestTokenBasedRememberMeServices(CookieConfig.getName(), userDetailsService);
|
tokenBasedRememberMeServices.setTokenValiditySeconds(CookieConfig.getInterval());
|
setRememberMeServices(tokenBasedRememberMeServices);
|
}
|
|
public void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) {
|
authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
|
}
|
}
|