kongzy
2023-09-22 3124f3a5b7f45d043b228829b6b3a2e541b31574
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
package com.nms.swspkmas_standalone.shiro.realm;
 
import cn.hutool.core.util.StrUtil;
import com.nms.swspkmas_standalone.entity.User;
import com.nms.swspkmas_standalone.exception.ApiException;
import com.nms.swspkmas_standalone.service.UserService;
import com.nms.swspkmas_standalone.shiro.token.JwtToken;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
 
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
 
/**
 * @Author ling.quan
 * @Date 2022/2/17 16:31
 * @Desciption jwtRealm:这个自定义的realm就比较关键了。它实现了认证和授权的两个方法。
 * 认证的方法里面,我们获取到JwtToken类的token后,获取token里面的参数信息(暂时只有username),然后查询“数据库”判断,没有则返回错误信息,即抛出异常,让subject.login(token)所在的方法捕获到异常进行处理。认证通过,即用户名所对应的对象存在,则返回SimpleAuthenticationInfo对象,让请求能够继续请求loginController
 * 授权的方法中,则是获取到token携带的的username信息来查询其拥有的权限,然后进行设置即可,至此,我们的shiro作用就发挥得差不多了
 * [realm是由shiroConfig中的securityManager调用的]
 *
 */
 
public class JwtRealm extends AuthorizingRealm {
 
    @Autowired
    private UserService userService;
 
    /**
     * 限定这个 Realm 只处理我们自定义的 JwtToken
     */
    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof JwtToken;
    }
 
    /**
     * 此处的 SimpleAuthenticationInfo 可返回任意值,密码校验时不会用到它
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)
            throws AuthenticationException {
        JwtToken jwtToken = (JwtToken) authcToken;
        if (jwtToken.getPrincipal() == null) {
            throw new AccountException("JWT token参数异常!");
        }
        // 从 JwtToken 中获取当前用户
        String username = jwtToken.getPrincipal().toString();
 
        if (StrUtil.isBlank(username)) {
            throw new UnknownAccountException("未登录!");
        }
 
        // 获取当前用户
        User currentUser = userService.getByUserName(username);
 
        if (currentUser == null) {
            throw new ApiException("用户不存在!");
        }
 
        ByteSource.Util.bytes("nms");
        return new SimpleAuthenticationInfo(currentUser, username, getName());
    }
 
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        // 获取当前用户
        User currentUser = (User) SecurityUtils.getSubject().getPrincipal();
        // UserEntity currentUser = (UserEntity) principals.getPrimaryPrincipal();
        Set roleSet=new HashSet();
        roleSet.add("");
        info.setRoles(roleSet);
        return info;
    }
 
}