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