package com.ruoyi.framework.wxopenidConfig;
|
|
import com.ruoyi.common.constant.Constants;
|
import com.ruoyi.common.core.redis.RedisCache;
|
import org.springframework.security.authentication.AuthenticationProvider;
|
import org.springframework.security.authentication.BadCredentialsException;
|
import org.springframework.security.core.Authentication;
|
import org.springframework.security.core.AuthenticationException;
|
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
import org.springframework.web.context.request.RequestContextHolder;
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.Map;
|
|
/**
|
* 微信OpenID登陆鉴权 Provider,要求实现 AuthenticationProvider 接口
|
*
|
*/
|
|
public class WxOpenIDAuthenticationProvider implements AuthenticationProvider {
|
|
private UserDetailsService userDetailsService;
|
|
|
|
@Override
|
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
|
WxOpenIDAuthenticationToken authenticationToken = (WxOpenIDAuthenticationToken) authentication;
|
|
String openid = (String) authenticationToken.getPrincipal();
|
|
|
UserDetails userDetails = userDetailsService.loadUserByUsername(openid);
|
|
// 此时鉴权成功后,应当重新 new 一个拥有鉴权的 authenticationResult 返回
|
WxOpenIDAuthenticationToken authenticationResult = new WxOpenIDAuthenticationToken(userDetails, userDetails.getAuthorities());
|
|
authenticationResult.setDetails(authenticationToken.getDetails());
|
|
return authenticationResult;
|
}
|
|
|
|
@Override
|
public boolean supports(Class<?> authentication) {
|
// 判断 authentication 是不是 SmsCodeAuthenticationToken 的子类或子接口
|
return WxOpenIDAuthenticationToken.class.isAssignableFrom(authentication);
|
}
|
|
public UserDetailsService getUserDetailsService() {
|
return userDetailsService;
|
}
|
|
public void setUserDetailsService(UserDetailsService userDetailsService) {
|
this.userDetailsService = userDetailsService;
|
}
|
}
|