forked from p85126437/datagear
service层支持缓存查询结果中的权限值
This commit is contained in:
parent
0eec052ed9
commit
a8c739e1a9
|
@ -277,6 +277,17 @@ public class Authorization extends AbstractStringIdEntity implements CloneableEn
|
|||
return (permission >= PERMISSION_DELETE_START);
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否是合法的权限值,即不小于{@linkplain #PERMISSION_MIN}、且不大于{@linkplain #PERMISSION_MAX}。
|
||||
*
|
||||
* @param permission
|
||||
* @return
|
||||
*/
|
||||
public static boolean isLegalPermission(int permission)
|
||||
{
|
||||
return (permission >= PERMISSION_MIN && permission <= PERMISSION_MAX);
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否可授权。
|
||||
* <p>
|
||||
|
|
|
@ -16,6 +16,7 @@ import java.util.Map;
|
|||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
import org.apache.ibatis.session.RowBounds;
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
import org.datagear.management.domain.Authorization;
|
||||
import org.datagear.management.domain.DataIdPermission;
|
||||
|
@ -46,6 +47,11 @@ public abstract class AbstractMybatisDataPermissionEntityService<ID, T extends D
|
|||
|
||||
private ServiceCache permissionCache;
|
||||
|
||||
/**
|
||||
* 查询操作时缓存权限数目。
|
||||
*/
|
||||
private int cachePermissionCountForQuery = 10;
|
||||
|
||||
public AbstractMybatisDataPermissionEntityService()
|
||||
{
|
||||
super();
|
||||
|
@ -65,6 +71,16 @@ public abstract class AbstractMybatisDataPermissionEntityService<ID, T extends D
|
|||
this.authorizationService = authorizationService;
|
||||
}
|
||||
|
||||
public AuthorizationService getAuthorizationService()
|
||||
{
|
||||
return authorizationService;
|
||||
}
|
||||
|
||||
public void setAuthorizationService(AuthorizationService authorizationService)
|
||||
{
|
||||
this.authorizationService = authorizationService;
|
||||
}
|
||||
|
||||
public ServiceCache getPermissionCache()
|
||||
{
|
||||
return permissionCache;
|
||||
|
@ -75,6 +91,16 @@ public abstract class AbstractMybatisDataPermissionEntityService<ID, T extends D
|
|||
this.permissionCache = permissionCache;
|
||||
}
|
||||
|
||||
public int getCachePermissionCountForQuery()
|
||||
{
|
||||
return cachePermissionCountForQuery;
|
||||
}
|
||||
|
||||
public void setCachePermissionCountForQuery(int cachePermissionCountForQuery)
|
||||
{
|
||||
this.cachePermissionCountForQuery = cachePermissionCountForQuery;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPermission(User user, ID id)
|
||||
{
|
||||
|
@ -269,6 +295,26 @@ public abstract class AbstractMybatisDataPermissionEntityService<ID, T extends D
|
|||
return count;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<T> query(String statement, Map<String, Object> params)
|
||||
{
|
||||
List<T> list = super.query(statement, params);
|
||||
|
||||
permissionCachePutQueryResult(statement, params, list);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<T> query(String statement, Map<String, Object> params, RowBounds rowBounds)
|
||||
{
|
||||
List<T> list = super.query(statement, params, rowBounds);
|
||||
|
||||
permissionCachePutQueryResult(statement, params, list);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取权限列表。
|
||||
* <p>
|
||||
|
@ -299,7 +345,7 @@ public abstract class AbstractMybatisDataPermissionEntityService<ID, T extends D
|
|||
}
|
||||
}
|
||||
|
||||
getPermissionsFromDB(user, noCachedIds, permissions);
|
||||
getPermissionsFromDB(user, noCachedIds, permissions, true);
|
||||
|
||||
List<Integer> re = new ArrayList<>(len);
|
||||
|
||||
|
@ -351,8 +397,9 @@ public abstract class AbstractMybatisDataPermissionEntityService<ID, T extends D
|
|||
* @param user
|
||||
* @param ids
|
||||
* @param permissions
|
||||
* @param cache
|
||||
*/
|
||||
protected void getPermissionsFromDB(User user ,List<ID> ids, Map<ID, Integer> permissions)
|
||||
protected void getPermissionsFromDB(User user, List<ID> ids, Map<ID, Integer> permissions, boolean cache)
|
||||
{
|
||||
if(ids.isEmpty())
|
||||
return;
|
||||
|
@ -385,7 +432,8 @@ public abstract class AbstractMybatisDataPermissionEntityService<ID, T extends D
|
|||
|
||||
permissions.put(id, permission);
|
||||
|
||||
permissionCachePut(id, userId, permission);
|
||||
if (cache)
|
||||
permissionCachePut(id, userId, permission);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -418,6 +466,40 @@ public abstract class AbstractMybatisDataPermissionEntityService<ID, T extends D
|
|||
upm.putPermission(userId, permission);
|
||||
}
|
||||
|
||||
protected void permissionCachePutQueryResult(String statement, Map<String, Object> params, List<T> result)
|
||||
{
|
||||
if (params == null || result == null || this.cachePermissionCountForQuery <= 0)
|
||||
return;
|
||||
|
||||
User user = (User) params.get(DATA_PERMISSION_PARAM_CURRENT_USER);
|
||||
|
||||
if (user == null)
|
||||
return;
|
||||
|
||||
String userId = user.getId();
|
||||
|
||||
int count = 0;
|
||||
|
||||
for (T t : result)
|
||||
{
|
||||
if (count >= this.cachePermissionCountForQuery)
|
||||
break;
|
||||
|
||||
ID id = (t == null ? null : t.getId());
|
||||
|
||||
if (id == null)
|
||||
continue;
|
||||
|
||||
int permission = t.getDataPermission();
|
||||
|
||||
if (Authorization.isLegalPermission(permission))
|
||||
{
|
||||
permissionCachePut(id, userId, permission);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void permissionCacheInvalidate()
|
||||
{
|
||||
if (!isPermissionCacheEnabled())
|
||||
|
|
|
@ -75,9 +75,9 @@ datasourceDialect=
|
|||
#是否禁用缓存:true 禁用;false 启用
|
||||
service.cache.disabled=false
|
||||
#缓存配置项
|
||||
#maximumSize 缓存容量,默认100
|
||||
#maximumSize 缓存容量,默认1000
|
||||
#expireAfterAccess 过期时间,默认3天(跨周末)
|
||||
service.cache.spec=maximumSize=100,expireAfterAccess=3d
|
||||
service.cache.spec=maximumSize=1000,expireAfterAccess=3d
|
||||
|
||||
#Spring Boot配置
|
||||
#-----------------------------------------
|
||||
|
|
Loading…
Reference in New Issue