package com.kiisoo.ic.config; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.kiisoo.ic.common.utils.MD5FileUtil; import com.kiisoo.ic.constants.Constants; import com.kiisoo.ic.system.entity.PrivilageAccountDO; import com.kiisoo.ic.system.mapper.PrivilageAccountDOMapper; 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.subject.SimplePrincipalCollection; import javax.annotation.Resource; /** * Shiro认证 * @author Arvin * */ public class AuthorizationRealm extends AuthorizingRealm { /** * 用户服务 */ @Resource private PrivilageAccountDOMapper privilageAccountDOMapper; /** * 菜单权限认证 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return new SimpleAuthorizationInfo(); } /** * 登陆认证 * @param authcToken 要认证的token信息 * @return authenticationInfo * @throws AuthenticationException 认证异常 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authcToken; // 获取用户的输入的账号. String account = (String)token.getPrincipal(); // encrypt token.setPassword(MD5FileUtil.getMD5String(new String(token.getPassword())).toCharArray()); // 通过username从数据库中查找 User对象,如果找到,没找到. // 实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("login",account).last("limit 1"); PrivilageAccountDO userInfo = privilageAccountDOMapper.selectOne(wrapper); if(userInfo == null){ throw new UnknownAccountException("用户不存在"); } if (Constants.ACCOUNT_STATUS_UNABLE != userInfo.getStatus()) { throw new LockedAccountException("无效账号"); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userInfo, userInfo.getPassword(), getName()); return info; } /** * 清除认证信息 * @param principal 主体 */ public void clearCachedAuthorizationInfo(String principal) { SimplePrincipalCollection principals = new SimplePrincipalCollection(principal, getName()); clearCachedAuthorizationInfo(principals); } }