package com.ruoyi.framework.web.ssoAuth; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.AuthenticationException; public class SsoCodeAuthenticationProvider implements AuthenticationProvider { private UserDetailsService userDetailsService; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { SsoCodeAuthenticationToken authenticationToken = (SsoCodeAuthenticationToken) authentication; String openId = (String) authenticationToken.getPrincipal(); UserDetails userDetails = userDetailsService.loadUserByUsername(openId); // 此时鉴权成功后,应当重新 new 一个拥有鉴权的 authenticationResult 返回 SsoCodeAuthenticationToken authenticationResult = new SsoCodeAuthenticationToken(userDetails, userDetails.getAuthorities()); authenticationResult.setDetails(authenticationToken.getDetails()); return authenticationResult; } @Override public boolean supports(Class authentication) { // 判断 authentication 是不是 SsoCodeAuthenticationToken 的子类或子接口 return SsoCodeAuthenticationToken.class.isAssignableFrom(authentication); } public UserDetailsService getUserDetailsService() { return userDetailsService; } public void setUserDetailsService(UserDetailsService userDetailsService) { this.userDetailsService = userDetailsService; } }