kongzy
2024-07-12 28aaf2ffa1dbb860a292ba330a7e9362e60e7832
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package com.gkhy.assess.framework.shiro.realm;
 
import com.gkhy.assess.common.domain.CustomerUsernamePasswordToken;
import com.gkhy.assess.common.enums.UserIdentityEnum;
import com.gkhy.assess.common.utils.RequestUtil;
import com.gkhy.assess.common.utils.SpringContextUtils;
import com.gkhy.assess.common.domain.JwtToken;
import com.gkhy.assess.common.utils.StringUtils;
import com.gkhy.assess.framework.shiro.service.SysLoginService;
import com.gkhy.assess.system.domain.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import javax.servlet.http.HttpServletRequest;
import java.util.HashSet;
import java.util.Set;
 
@Slf4j
@Component
public class UserRealm extends AuthorizingRealm {
 
    @Autowired
    private SysLoginService sysLoginService;
    /**
     * 授权
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SysUser sysUser = (SysUser) principalCollection.getPrimaryPrincipal();
        Set<String> roles=new HashSet<>();
        Set<String> menus=new HashSet<>();
        SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
        if(sysUser.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
            info.addRole("monitor");
            info.addStringPermission("system:assess:monitor");
        }else if(sysUser.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())){
            info.addRole("agency");
            info.addStringPermission("system:assess:agency");
        }else{
            info.addRole("expert");
            info.addStringPermission("system:assess:expert");
        }
 
        return info;
    }
 
    /**
     * 认证
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        HttpServletRequest req = SpringContextUtils.getHttpServletRequest();
        SysUser sysUser=null;
        if(authenticationToken instanceof JwtToken){
            String token= (String) authenticationToken.getCredentials();
            if(StringUtils.isBlank(token)){
                log.info("————————身份认证失败——————————IP地址:  "+ RequestUtil.getRequestIp(req) +",URL:"+req.getRequestURI());
                throw new AuthenticationException("token为空!");
            }
            sysUser=sysLoginService.validJwtToken(token);
            if(sysUser!=null){
                return new SimpleAuthenticationInfo(sysUser,token,this.getName());
            }
        }else{
            CustomerUsernamePasswordToken upToken = (CustomerUsernamePasswordToken) authenticationToken;
            String username = upToken.getUsername();
            String password=new String(upToken.getPassword());
            sysUser=sysLoginService.login(username,password,upToken.getIdentity());
            if(sysUser!=null){
                return new SimpleAuthenticationInfo(sysUser,password,this.getName());
            }
        }
 
        return null;
    }
 
 
    /**
     * 清理指定用户授权信息缓存
     */
    public void clearCachedAuthorizationInfo(Object principal)
    {
        SimplePrincipalCollection principals = new SimplePrincipalCollection(principal, getName());
        this.clearCachedAuthorizationInfo(principals);
    }
 
    /**
     * 清理所有用户授权信息缓存
     */
    public void clearAllCachedAuthorizationInfo()
    {
        Cache<Object, AuthorizationInfo> cache = getAuthorizationCache();
        if (cache != null)
        {
            for (Object key : cache.keys())
            {
                cache.remove(key);
            }
        }
    }
}