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; } }