package com.lxzn.auth.security; import com.lxzn.framework.domain.ucenter.Menu; import com.lxzn.framework.domain.ucenter.ext.UserExt; import com.lxzn.ucenter.service.IUserService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.Authentication; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.oauth2.provider.ClientDetails; import org.springframework.security.oauth2.provider.ClientDetailsService; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private IUserService userService; @Autowired private ClientDetailsService clientDetailsService; @Value("${auth.clientId}") private String clientId; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { if (StringUtils.isEmpty(username)) { return null; } //取出身份,如果身份为空说明没有认证 Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); //没有认证统一采用httpbasic认证,httpbasic中存储了client_id和client_secret,开始认证client_id和client_secret if(authentication==null || username.equals(clientId)){ //return new User(username, BCryptUtil.encode(clientSecret),AuthorityUtils.commaSeparatedStringToAuthorityList("")); ClientDetails clientDetails = clientDetailsService.loadClientByClientId(username); if(clientDetails != null){ //密码 String clientSecret = clientDetails.getClientSecret(); return new User(username,clientSecret,AuthorityUtils.commaSeparatedStringToAuthorityList("")); } } //远程调用用户中心根据账号查询用户信息 UserExt userExt = userService.findUserExtByUsername(username); if(userExt == null) { return null; } //如果没有任何菜单权限则不允许登陆系统 if(userExt.getPermissions() == null || userExt.getPermissions().isEmpty()) return null; //userExt.setPermissions(new ArrayList());//权限暂时用静态的 //取出正确密码(hash值) String password = userExt.getPassword(); //用户权限,这里暂时使用静态数据,最终会从数据库读取 //从数据库获取权限 TODO jwt中的权限设计暂未确定 List permissions = userExt.getPermissions(); List userPermission = new ArrayList<>(); List userMenus = new ArrayList<>(); //permissions.forEach(item-> userPermission.add(item.getPermCode())); permissions.forEach(item-> userMenus.add(item.getMenuUrl())); String user_permission_string = StringUtils.join(userPermission.toArray(), ","); UserJwt userDetails = new UserJwt(username, password, AuthorityUtils.commaSeparatedStringToAuthorityList(user_permission_string)); userDetails.setUserId(userExt.getUserId()); userDetails.setUserType(userExt.getUserType());//用户类型 userDetails.setUserPic(userExt.getUserPic());//用户头像 userDetails.setNickname(userExt.getNickname()); userDetails.setMenus(userMenus); return userDetails; } }