|
@ -10,10 +10,12 @@ import org.apache.shiro.authz.SimpleAuthorizationInfo; |
|
|
import org.apache.shiro.realm.AuthorizingRealm; |
|
|
import org.apache.shiro.realm.AuthorizingRealm; |
|
|
import org.apache.shiro.subject.PrincipalCollection; |
|
|
import org.apache.shiro.subject.PrincipalCollection; |
|
|
import org.jeecg.common.api.CommonAPI; |
|
|
import org.jeecg.common.api.CommonAPI; |
|
|
|
|
|
import org.jeecg.common.api.IAppletUserService; |
|
|
import org.jeecg.common.config.TenantContext; |
|
|
import org.jeecg.common.config.TenantContext; |
|
|
import org.jeecg.common.constant.CacheConstant; |
|
|
import org.jeecg.common.constant.CacheConstant; |
|
|
import org.jeecg.common.constant.CommonConstant; |
|
|
import org.jeecg.common.constant.CommonConstant; |
|
|
import org.jeecg.common.system.util.JwtUtil; |
|
|
import org.jeecg.common.system.util.JwtUtil; |
|
|
|
|
|
import org.jeecg.common.system.vo.AppletUser; |
|
|
import org.jeecg.common.system.vo.LoginUser; |
|
|
import org.jeecg.common.system.vo.LoginUser; |
|
|
import org.jeecg.common.util.RedisUtil; |
|
|
import org.jeecg.common.util.RedisUtil; |
|
|
import org.jeecg.common.util.SpringContextUtils; |
|
|
import org.jeecg.common.util.SpringContextUtils; |
|
@ -44,12 +46,16 @@ public class ShiroRealm extends AuthorizingRealm { |
|
|
@Resource |
|
|
@Resource |
|
|
private RedisUtil redisUtil; |
|
|
private RedisUtil redisUtil; |
|
|
|
|
|
|
|
|
|
|
|
@Lazy |
|
|
|
|
|
@Resource |
|
|
|
|
|
private IAppletUserService appletUserService; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 必须重写此方法,不然Shiro会报错 |
|
|
* 必须重写此方法,不然Shiro会报错 |
|
|
*/ |
|
|
*/ |
|
|
@Override |
|
|
@Override |
|
|
public boolean supports(AuthenticationToken token) { |
|
|
public boolean supports(AuthenticationToken token) { |
|
|
return token instanceof JwtToken; |
|
|
|
|
|
|
|
|
return token instanceof JwtToken || token instanceof AppletJwtToken; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -65,6 +71,11 @@ public class ShiroRealm extends AuthorizingRealm { |
|
|
String username = null; |
|
|
String username = null; |
|
|
String userId = null; |
|
|
String userId = null; |
|
|
if (principals != null) { |
|
|
if (principals != null) { |
|
|
|
|
|
|
|
|
|
|
|
if (principals.getPrimaryPrincipal() instanceof AppletUser){ |
|
|
|
|
|
return new SimpleAuthorizationInfo(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
LoginUser sysUser = (LoginUser) principals.getPrimaryPrincipal(); |
|
|
LoginUser sysUser = (LoginUser) principals.getPrimaryPrincipal(); |
|
|
username = sysUser.getUsername(); |
|
|
username = sysUser.getUsername(); |
|
|
userId = sysUser.getId(); |
|
|
userId = sysUser.getId(); |
|
@ -102,9 +113,16 @@ public class ShiroRealm extends AuthorizingRealm { |
|
|
throw new AuthenticationException("token为空!"); |
|
|
throw new AuthenticationException("token为空!"); |
|
|
} |
|
|
} |
|
|
// 校验token有效性 |
|
|
// 校验token有效性 |
|
|
LoginUser loginUser = null; |
|
|
|
|
|
|
|
|
Object loginUser = null; |
|
|
try { |
|
|
try { |
|
|
loginUser = this.checkUserTokenIsEffect(token); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (auth instanceof AppletJwtToken){ |
|
|
|
|
|
String openid = JwtUtil.getUsername(token); |
|
|
|
|
|
loginUser = getAppletUser(openid, token); |
|
|
|
|
|
}else { |
|
|
|
|
|
loginUser = this.checkUserTokenIsEffect(token); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} catch (AuthenticationException e) { |
|
|
} catch (AuthenticationException e) { |
|
|
JwtUtil.responseError(SpringContextUtils.getHttpServletResponse(),401,e.getMessage()); |
|
|
JwtUtil.responseError(SpringContextUtils.getHttpServletResponse(),401,e.getMessage()); |
|
|
e.printStackTrace(); |
|
|
e.printStackTrace(); |
|
@ -181,6 +199,40 @@ public class ShiroRealm extends AuthorizingRealm { |
|
|
return loginUser; |
|
|
return loginUser; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 获取小程序用户信息 |
|
|
|
|
|
* |
|
|
|
|
|
* @param openid |
|
|
|
|
|
* @param token |
|
|
|
|
|
* @return 用户信息 |
|
|
|
|
|
*/ |
|
|
|
|
|
private AppletUser getAppletUser(String openid, String token) { |
|
|
|
|
|
try { |
|
|
|
|
|
log.debug("开始获取小程序用户信息,openid: {}", openid); |
|
|
|
|
|
if (openid == null) { |
|
|
|
|
|
throw new AuthenticationException("小程序token非法无效!"); |
|
|
|
|
|
} |
|
|
|
|
|
// 从数据库查询用户信息 |
|
|
|
|
|
AppletUser appletUser = appletUserService.getByOpenid(openid); |
|
|
|
|
|
|
|
|
|
|
|
if (appletUser != null) { |
|
|
|
|
|
log.debug("从数据库获取到小程序用户: {}", appletUser.getName()); |
|
|
|
|
|
return appletUser; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!jwtTokenRefresh(token, openid, appletUser.getId())) { |
|
|
|
|
|
throw new AuthenticationException(CommonConstant.TOKEN_IS_INVALID_MSG); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
log.warn("未找到小程序用户,openid: {}", openid); |
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
log.error("获取小程序用户信息异常,openid: {}", openid, e); |
|
|
|
|
|
return null; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* JWTToken刷新生命周期 (实现: 用户在线操作不掉线功能) |
|
|
* JWTToken刷新生命周期 (实现: 用户在线操作不掉线功能) |
|
|
* 1、登录成功后将用户的JWT生成的Token作为k、v存储到cache缓存里面(这时候k、v值一样),缓存有效期设置为Jwt有效时间的2倍 |
|
|
* 1、登录成功后将用户的JWT生成的Token作为k、v存储到cache缓存里面(这时候k、v值一样),缓存有效期设置为Jwt有效时间的2倍 |
|
|