package com.mossle.security.client; import java.util.Collections; import com.mossle.api.tenant.TenantHolder; import com.mossle.api.userauth.UserAuthConnector; import com.mossle.api.userauth.UserAuthDTO; import com.mossle.core.mapper.BeanMapper; import com.mossle.security.impl.SpringSecurityUserAuth; import com.mossle.spi.user.AccountAliasConnector; import com.mossle.spi.user.AccountCredentialConnector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; public class DefaultUserDetailsService implements UserDetailsService { private static Logger logger = LoggerFactory .getLogger(DefaultUserDetailsService.class); private UserAuthConnector userAuthConnector; private AccountCredentialConnector accountCredentialConnector; private AccountAliasConnector accountAliasConnector; private String defaultPassword; private BeanMapper beanMapper = new BeanMapper(); private boolean debug; private TenantHolder tenantHolder; /** * 遇到的问题. * * 主要流程为 1.判断用户是否存在 2.读取用户权限 3.创建UserDetails */ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { logger.debug("username : {}", username); String tenantId = tenantHolder.getTenantId(); if (debug) { SpringSecurityUserAuth userAuth = new SpringSecurityUserAuth(); userAuth.setId("1"); userAuth.setUsername(username); userAuth.setDisplayName(username); userAuth.setPermissions(Collections.singletonList("*")); userAuth.setTenantId(tenantId); return userAuth; } if (username == null) { logger.info("username is null"); return null; } username = username.toLowerCase(); try { username = accountAliasConnector.findUsernameByAlias(username); UserAuthDTO userAuthDto = userAuthConnector.findByUsername( username, tenantId); if (userAuthDto == null) { logger.info("cannot find user : {}, {}", username, tenantId); throw new UsernameNotFoundException(username + "," + tenantId); } String password = accountCredentialConnector.findPassword(username, tenantId); SpringSecurityUserAuth userAuthResult = new SpringSecurityUserAuth(); beanMapper.copy(userAuthDto, userAuthResult); userAuthResult.setPassword(password); if (defaultPassword != null) { userAuthResult.setPassword(defaultPassword); } return userAuthResult; } catch (UsernameNotFoundException ex) { throw ex; } catch (Exception ex) { logger.error(ex.getMessage(), ex); throw new UsernameNotFoundException(username, ex); } } public void setUserAuthConnector(UserAuthConnector userAuthConnector) { this.userAuthConnector = userAuthConnector; } public void setAccountCredentialConnector( AccountCredentialConnector accountCredentialConnector) { this.accountCredentialConnector = accountCredentialConnector; } public void setAccountAliasConnector( AccountAliasConnector accountAliasConnector) { this.accountAliasConnector = accountAliasConnector; } public void setDefaultPassword(String defaultPassword) { this.defaultPassword = defaultPassword; } public void setDebug(boolean debug) { this.debug = debug; } public void setTenantHolder(TenantHolder tenantHolder) { this.tenantHolder = tenantHolder; } }