fix: 解决角色缓存清空造成查询无权限问题

This commit is contained in:
qiufeng
2022-12-19 21:23:40 +08:00
parent 4780029a60
commit c7e10bc249
21 changed files with 133 additions and 43 deletions
@@ -1,4 +1,4 @@
package cn.com.mfish.oauth.api.entity;
package cn.com.mfish.common.oauth.api.entity;
import cn.com.mfish.common.core.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
@@ -1,4 +1,4 @@
package cn.com.mfish.oauth.api.entity;
package cn.com.mfish.common.oauth.api.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -1,12 +1,16 @@
package cn.com.mfish.oauth.api.fallback;
package cn.com.mfish.common.oauth.api.fallback;
import cn.com.mfish.common.core.web.Result;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.oauth.api.remote.RemoteUserService;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.entity.UserRole;
import cn.com.mfish.common.oauth.api.remote.RemoteUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Set;
/**
* @author qiufeng
* @descriptionFeign用户接口降级
@@ -29,6 +33,16 @@ public class RemoteUserFallback implements FallbackFactory<RemoteUserService> {
return Result.fail("错误:通过ID获取用户失败" + cause.getMessage());
}
@Override
public Result<List<UserRole>> getRoles(String origin, String userId, String clientId) {
return Result.fail("错误:获取角色信息失败" + cause.getMessage());
}
@Override
public Result<Set<String>> getPermissions(String origin, String userId, String clientId) {
return Result.fail("错误:获取按钮权限失败" + cause.getMessage());
}
};
}
}
@@ -1,15 +1,20 @@
package cn.com.mfish.oauth.api.remote;
package cn.com.mfish.common.oauth.api.remote;
import cn.com.mfish.common.core.constants.Constants;
import cn.com.mfish.common.core.constants.CredentialConstants;
import cn.com.mfish.common.core.constants.ServiceConstants;
import cn.com.mfish.common.core.web.Result;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.oauth.api.fallback.RemoteUserFallback;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.entity.UserRole;
import cn.com.mfish.common.oauth.api.fallback.RemoteUserFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Set;
/**
* @author qiufeng
@@ -31,4 +36,25 @@ public interface RemoteUserService {
@GetMapping("/user/{id}")
Result<UserInfo> getUserById(@RequestHeader(CredentialConstants.REQ_ORIGIN) String origin, @PathVariable("id") String id);
/**
* 获取用户角色
*
* @param origin
* @param userId
* @param clientId
* @return
*/
@GetMapping("/user/roles")
Result<List<UserRole>> getRoles(@RequestHeader(CredentialConstants.REQ_ORIGIN) String origin, @RequestParam("userId") String userId, @RequestParam("clientId") String clientId);
/**
* 获取用户权限
*
* @param origin
* @param userId
* @param clientId
* @return
*/
@GetMapping("/user/permissions")
Result<Set<String>> getPermissions(@RequestHeader(CredentialConstants.REQ_ORIGIN) String origin, @RequestParam("userId") String userId, @RequestParam("clientId") String clientId);
}
@@ -1,7 +1,7 @@
package cn.com.mfish.oauth.api.vo;
package cn.com.mfish.common.oauth.api.vo;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.oauth.api.entity.UserRole;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.entity.UserRole;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -1,2 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.com.mfish.oauth.api.fallback.RemoteUserFallback
cn.com.mfish.common.oauth.api.fallback.RemoteUserFallback
@@ -1,9 +1,13 @@
package cn.com.mfish.common.oauth.cache;
import cn.com.mfish.common.core.constants.CredentialConstants;
import cn.com.mfish.common.core.web.Result;
import cn.com.mfish.common.oauth.api.remote.RemoteUserService;
import cn.com.mfish.common.redis.common.RedisPrefix;
import cn.com.mfish.common.redis.temp.BaseTempCache;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Set;
/**
@@ -14,6 +18,9 @@ import java.util.Set;
@Component("userPermissionCache")
public class UserPermissionCache extends BaseTempCache<Set<String>> {
@Resource
RemoteUserService remoteUserService;
/**
* key [0] userId [1] clientId
*
@@ -33,6 +40,10 @@ public class UserPermissionCache extends BaseTempCache<Set<String>> {
*/
@Override
protected Set<String> getFromDB(String... key) {
return null;
Result<Set<String>> result = remoteUserService.getPermissions(CredentialConstants.INNER, key[0], key[1]);
if (result == null || !result.isSuccess()) {
return null;
}
return result.getData();
}
}
@@ -1,10 +1,14 @@
package cn.com.mfish.common.oauth.cache;
import cn.com.mfish.common.core.constants.CredentialConstants;
import cn.com.mfish.common.core.web.Result;
import cn.com.mfish.common.oauth.api.remote.RemoteUserService;
import cn.com.mfish.common.redis.common.RedisPrefix;
import cn.com.mfish.common.redis.temp.BaseTempCache;
import cn.com.mfish.oauth.api.entity.UserRole;
import cn.com.mfish.common.oauth.api.entity.UserRole;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
@@ -15,6 +19,9 @@ import java.util.List;
@Component("userRoleCache")
public class UserRoleCache extends BaseTempCache<List<UserRole>> {
@Resource
RemoteUserService remoteUserService;
/**
* key [0] userId [1] clientId
*
@@ -34,6 +41,10 @@ public class UserRoleCache extends BaseTempCache<List<UserRole>> {
*/
@Override
protected List<UserRole> getFromDB(String... key) {
return null;
Result<List<UserRole>> result = remoteUserService.getRoles(CredentialConstants.INNER, key[0], key[1]);
if (result == null || !result.isSuccess()) {
return null;
}
return result.getData();
}
}
@@ -6,7 +6,7 @@ import cn.com.mfish.common.oauth.annotation.RequiresPermissions;
import cn.com.mfish.common.oauth.annotation.RequiresRoles;
import cn.com.mfish.common.oauth.cache.UserPermissionCache;
import cn.com.mfish.common.oauth.cache.UserRoleCache;
import cn.com.mfish.oauth.api.entity.UserRole;
import cn.com.mfish.common.oauth.api.entity.UserRole;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
@@ -40,7 +40,7 @@ public class OauthUtils {
*/
public static boolean checkRoles(RequiresRoles requiresRoles) {
UserRoleCache userRoleCache = SpringBeanFactory.getBean("userRoleCache");
List<UserRole> list = userRoleCache.getFromCache(AuthInfoUtils.getCurrentUserId(), AuthInfoUtils.getCurrentClientId());
List<UserRole> list = userRoleCache.getFromCacheAndDB(AuthInfoUtils.getCurrentUserId(), AuthInfoUtils.getCurrentClientId());
Set<String> set = list.stream().map(UserRole::getRoleCode).collect(Collectors.toSet());
//如果用户为超户,直接返回
if (null != set && set.contains(SerConstant.SUPER_ROLE)) {
@@ -57,7 +57,7 @@ public class OauthUtils {
*/
public static boolean checkPermission(RequiresPermissions requiresPermissions) {
UserPermissionCache userPermissionCache = SpringBeanFactory.getBean("userPermissionCache");
Set<String> set = userPermissionCache.getFromCache(AuthInfoUtils.getCurrentUserId(), AuthInfoUtils.getCurrentClientId());
Set<String> set = userPermissionCache.getFromCacheAndDB(AuthInfoUtils.getCurrentUserId(), AuthInfoUtils.getCurrentClientId());
//如果用户拥有所有权限直接返回true
if (null != set && set.contains(SerConstant.ALL_PERMISSION)) {
return true;
@@ -1,7 +1,7 @@
package cn.com.mfish.oauth.cache.temp;
import cn.com.mfish.common.oauth.cache.UserRoleCache;
import cn.com.mfish.oauth.api.entity.UserRole;
import cn.com.mfish.common.oauth.api.entity.UserRole;
import cn.com.mfish.oauth.mapper.SsoUserMapper;
import org.springframework.stereotype.Component;
@@ -3,23 +3,23 @@ package cn.com.mfish.oauth.controller;
import cn.com.mfish.common.core.enums.DeviceType;
import cn.com.mfish.common.core.enums.OperateType;
import cn.com.mfish.common.core.utils.AuthInfoUtils;
import cn.com.mfish.common.core.utils.StringUtils;
import cn.com.mfish.common.core.web.Result;
import cn.com.mfish.common.log.annotation.Log;
import cn.com.mfish.common.oauth.annotation.RequiresPermissions;
import cn.com.mfish.common.web.annotation.InnerUser;
import cn.com.mfish.common.web.page.PageResult;
import cn.com.mfish.common.web.page.ReqPage;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.oauth.api.vo.UserInfoVo;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.entity.UserRole;
import cn.com.mfish.common.oauth.api.vo.UserInfoVo;
import cn.com.mfish.oauth.cache.redis.UserTokenCache;
import cn.com.mfish.oauth.entity.SsoUser;
import cn.com.mfish.oauth.req.ReqSsoUser;
import cn.com.mfish.oauth.service.OAuth2Service;
import cn.com.mfish.oauth.service.SsoUserService;
import com.github.pagehelper.PageHelper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
@@ -58,8 +58,36 @@ public class SsoUserController {
@ApiOperation("获取用户权限")
@GetMapping("/permissions")
@Log(title = "获取用户权限", operateType = OperateType.QUERY)
public Result<Set<String>> getPermissions() {
return Result.ok(ssoUserService.getUserPermissions(AuthInfoUtils.getCurrentUserId(), AuthInfoUtils.getCurrentClientId()));
@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "用户ID"),
@ApiImplicitParam(name = "clientId", value = "客户端ID")
})
public Result<Set<String>> getPermissions(String userId, String clientId) {
if (StringUtils.isEmpty(userId)) {
userId = AuthInfoUtils.getCurrentUserId();
}
if (StringUtils.isEmpty(clientId)) {
clientId = AuthInfoUtils.getCurrentClientId();
}
return Result.ok(ssoUserService.getUserPermissions(userId, clientId));
}
@InnerUser
@ApiOperation("获取用户角色")
@GetMapping("/roles")
@Log(title = "获取用户权限", operateType = OperateType.QUERY)
@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "用户ID"),
@ApiImplicitParam(name = "clientId", value = "客户端ID")
})
public Result<List<UserRole>> getRoles(String userId, String clientId) {
if (StringUtils.isEmpty(userId)) {
userId = AuthInfoUtils.getCurrentUserId();
}
if (StringUtils.isEmpty(clientId)) {
clientId = AuthInfoUtils.getCurrentClientId();
}
return Result.ok(ssoUserService.getUserRoles(userId, clientId));
}
@InnerUser
@@ -9,7 +9,7 @@ import cn.com.mfish.common.core.utils.Utils;
import cn.com.mfish.common.core.web.Result;
import cn.com.mfish.common.log.annotation.Log;
import cn.com.mfish.common.oauth.common.SerConstant;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import cn.com.mfish.oauth.entity.AccessToken;
import cn.com.mfish.oauth.entity.WeChatToken;
import cn.com.mfish.oauth.service.LoginService;
@@ -1,6 +1,6 @@
package cn.com.mfish.oauth.entity;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -1,7 +1,7 @@
package cn.com.mfish.oauth.mapper;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.oauth.api.entity.UserRole;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.entity.UserRole;
import cn.com.mfish.oauth.entity.SsoUser;
import cn.com.mfish.oauth.req.ReqSsoUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -28,7 +28,7 @@
<include refid="userState"/>
</where>
</select>
<select id="getUserRoles" resultType="cn.com.mfish.oauth.api.entity.UserRole">
<select id="getUserRoles" resultType="cn.com.mfish.common.oauth.api.entity.UserRole">
select r.id, r.role_name, r.role_code
from sso_user u
inner join sso_user_role ur on ur.user_id = u.id
@@ -66,7 +66,7 @@
</if>
</where>
</select>
<resultMap id="userMap" type="cn.com.mfish.oauth.api.entity.UserInfo">
<resultMap id="userMap" type="cn.com.mfish.common.oauth.api.entity.UserInfo">
<result property="roleIds" column="roleIds"
typeHandler="cn.com.mfish.oauth.handler.StrToListTypeHandler"></result>
</resultMap>
@@ -1,7 +1,7 @@
package cn.com.mfish.oauth.service;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.oauth.api.vo.UserInfoVo;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.vo.UserInfoVo;
import cn.com.mfish.common.oauth.entity.AuthorizationCode;
import cn.com.mfish.common.oauth.entity.RedisAccessToken;
import org.apache.oltu.oauth2.as.request.OAuthAuthzRequest;
@@ -1,8 +1,8 @@
package cn.com.mfish.oauth.service;
import cn.com.mfish.common.core.web.Result;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.oauth.api.entity.UserRole;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.entity.UserRole;
import cn.com.mfish.oauth.entity.SsoUser;
import cn.com.mfish.oauth.req.ReqSsoUser;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -2,8 +2,8 @@ package cn.com.mfish.oauth.service.impl;
import cn.com.mfish.common.core.exception.OAuthValidateException;
import cn.com.mfish.common.core.utils.AuthInfoUtils;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.oauth.api.vo.UserInfoVo;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.vo.UserInfoVo;
import cn.com.mfish.common.redis.common.RedisPrefix;
import cn.com.mfish.common.oauth.entity.AuthorizationCode;
import cn.com.mfish.common.oauth.entity.RedisAccessToken;
@@ -4,8 +4,8 @@ import cn.com.mfish.common.core.exception.MyRuntimeException;
import cn.com.mfish.common.core.utils.AuthInfoUtils;
import cn.com.mfish.common.core.utils.Utils;
import cn.com.mfish.common.core.web.Result;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.oauth.api.entity.UserRole;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.entity.UserRole;
import cn.com.mfish.oauth.cache.temp.Account2IdTempCache;
import cn.com.mfish.oauth.cache.temp.UserPermissionTempCache;
import cn.com.mfish.oauth.cache.temp.UserRoleTempCache;
@@ -7,8 +7,8 @@ import cn.com.mfish.common.core.enums.ReqSource;
import cn.com.mfish.common.core.utils.AuthInfoUtils;
import cn.com.mfish.common.core.web.Result;
import cn.com.mfish.common.log.annotation.Log;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.oauth.api.remote.RemoteUserService;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.remote.RemoteUserService;
import cn.com.mfish.test.entity.TestParam;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
@@ -1,6 +1,6 @@
package cn.com.mfish.test.entity;
import cn.com.mfish.oauth.api.entity.UserInfo;
import cn.com.mfish.common.oauth.api.entity.UserInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;