lyh
3 天以前 3ce27b7faf8850d101a1511a685250fe562dca18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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<Menu>());//权限暂时用静态的
 
        //取出正确密码(hash值)
        String password = userExt.getPassword();
        //用户权限,这里暂时使用静态数据,最终会从数据库读取
        //从数据库获取权限 TODO jwt中的权限设计暂未确定
        List<Menu> permissions = userExt.getPermissions();
        List<String> userPermission = new ArrayList<>();
        List<String> 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;
    }
}