mirror of
https://github.com/mfish-qf/mfish-nocode.git
synced 2026-09-01 15:09:52 +08:00
fix: 解决角色缓存清空造成查询无权限问题
This commit is contained in:
+1
-1
@@ -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
-1
@@ -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;
|
||||
+17
-3
@@ -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
|
||||
* @description:Feign用户接口降级
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
+29
-3
@@ -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);
|
||||
}
|
||||
+3
-3
@@ -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
|
||||
|
||||
Vendored
+12
-1
@@ -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();
|
||||
}
|
||||
}
|
||||
+13
-2
@@ -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();
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -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
-1
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user