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; } }