package com.ruoyi.common.security.config; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.oauth2.provider.token.UserAuthenticationConverter; import org.springframework.util.StringUtils; import com.ruoyi.common.core.constant.SecurityConstants; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.security.domain.LoginUser; /** * https://my.oschina.net/giegie/blog/3023768 根据checktoken 的结果转化用户信息 * * @author lengleng */ public class CommonUserConverter implements UserAuthenticationConverter { private static final String N_A = "N/A"; /** * 将授权信息返回到资源服务 */ @Override public Map convertUserAuthentication(Authentication userAuthentication) { Map authMap = new LinkedHashMap<>(); authMap.put(USERNAME, userAuthentication.getName()); if (userAuthentication.getAuthorities() != null && !userAuthentication.getAuthorities().isEmpty()) { authMap.put(AUTHORITIES, AuthorityUtils.authorityListToSet(userAuthentication.getAuthorities())); } return authMap; } /** * 获取用户认证信息 */ @Override public Authentication extractAuthentication(Map map) { if (map.containsKey(USERNAME)) { Collection authorities = getAuthorities(map); Long userId = Convert.toLong(map.get(SecurityConstants.DETAILS_USER_ID)); String username = (String) map.get(SecurityConstants.DETAILS_USERNAME); LoginUser user = new LoginUser(userId, username, N_A, true, true, true, true, authorities); return new UsernamePasswordAuthenticationToken(user, N_A, authorities); } return null; } /** * 获取权限资源信息 */ private Collection getAuthorities(Map map) { Object authorities = map.get(AUTHORITIES); if (authorities instanceof String) { return AuthorityUtils.commaSeparatedStringToAuthorityList((String) authorities); } if (authorities instanceof Collection) { return AuthorityUtils.commaSeparatedStringToAuthorityList( StringUtils.collectionToCommaDelimitedString((Collection) authorities)); } throw new IllegalArgumentException("Authorities must be either a String or a Collection"); } }