AnalysisProject授权有变更时刷新数据集、图表、看板的权限缓存

This commit is contained in:
datagear 2021-08-20 22:40:47 +08:00
parent c1b9722e82
commit 0eec052ed9
11 changed files with 212 additions and 3 deletions

View File

@ -0,0 +1,27 @@
/*
* Copyright 2018 datagear.tech
*
* Licensed under the LGPLv3 license:
* http://www.gnu.org/licenses/lgpl-3.0.html
*/
package org.datagear.management.service;
import org.datagear.management.domain.AnalysisProject;
/**
* {@linkplain AnalysisProject}授权监听器
*
* @author datagear@163.com
*
*/
public interface AnalysisProjectAuthorizationListener
{
/**
* 指定ID的{@linkplain AnalysisProject}授权已更新
*
* @param analysisProjects
*/
void authorizationUpdated(String... analysisProjects);
}

View File

@ -18,7 +18,7 @@ import org.datagear.persistence.PagingQuery;
* @author datagear@163.com
*
*/
public interface AnalysisProjectAwareEntityService<T>
public interface AnalysisProjectAwareEntityService<T> extends AnalysisProjectAuthorizationListener
{
String QUERY_PARAM_ANALYSIS_PROJECT_ID = "_analysisProjectId";

View File

@ -207,12 +207,19 @@ public abstract class AbstractMybatisDataPermissionEntityService<ID, T extends D
@Override
public void authorizationUpdated(String resourceType, String... resources)
{
authorizationUpdatedInner(resourceType, resources);
}
protected boolean authorizationUpdatedInner(String resourceType, String... resources)
{
if (!getResourceType().equals(resourceType))
return;
return false;
for (String res : resources)
this.permissionCache.evictImmediately(toPermissionCacheKeyOfStr(res));
return true;
}
@Override

View File

@ -0,0 +1,34 @@
/*
* Copyright 2018 datagear.tech
*
* Licensed under the LGPLv3 license:
* http://www.gnu.org/licenses/lgpl-3.0.html
*/
package org.datagear.management.service.impl;
import org.datagear.management.service.AnalysisProjectAuthorizationListener;
/**
* {@linkplain AnalysisProjectAuthorizationListener}相关类
*
* @author datagear@163.com
*
*/
public interface AnalysisProjectAuthorizationListenerAware
{
/**
* 获取{@linkplain AnalysisProjectAuthorizationListener}
*
* @return 可能为{@code null}
*/
AnalysisProjectAuthorizationListener getAnalysisProjectAuthorizationListener();
/**
* 设置{@linkplain AnalysisProjectAuthorizationListener}
*
* @param analysisProjectAuthorizationListener 允许为{@code null}
*/
void setAnalysisProjectAuthorizationListener(
AnalysisProjectAuthorizationListener analysisProjectAuthorizationListener);
}

View File

@ -10,6 +10,7 @@ package org.datagear.management.service.impl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.datagear.management.domain.AnalysisProject;
import org.datagear.management.domain.User;
import org.datagear.management.service.AnalysisProjectAuthorizationListener;
import org.datagear.management.service.AnalysisProjectService;
import org.datagear.management.service.AuthorizationService;
import org.datagear.management.service.PermissionDeniedException;
@ -24,12 +25,14 @@ import org.mybatis.spring.SqlSessionTemplate;
*
*/
public class AnalysisProjectServiceImpl extends AbstractMybatisDataPermissionEntityService<String, AnalysisProject>
implements AnalysisProjectService
implements AnalysisProjectService, AnalysisProjectAuthorizationListenerAware
{
protected static final String SQL_NAMESPACE = AnalysisProject.class.getName();
private UserService userService;
private AnalysisProjectAuthorizationListener analysisProjectAuthorizationListener = null;
public AnalysisProjectServiceImpl()
{
super();
@ -49,6 +52,29 @@ public class AnalysisProjectServiceImpl extends AbstractMybatisDataPermissionEnt
this.userService = userService;
}
public UserService getUserService()
{
return userService;
}
public void setUserService(UserService userService)
{
this.userService = userService;
}
@Override
public AnalysisProjectAuthorizationListener getAnalysisProjectAuthorizationListener()
{
return analysisProjectAuthorizationListener;
}
@Override
public void setAnalysisProjectAuthorizationListener(
AnalysisProjectAuthorizationListener analysisProjectAuthorizationListener)
{
this.analysisProjectAuthorizationListener = analysisProjectAuthorizationListener;
}
@Override
public String getResourceType()
{
@ -74,6 +100,15 @@ public class AnalysisProjectServiceImpl extends AbstractMybatisDataPermissionEnt
return super.postProcessGet(obj);
}
@Override
public void authorizationUpdated(String resourceType, String... resources)
{
boolean updated = authorizationUpdatedInner(resourceType, resources);
if (updated && this.analysisProjectAuthorizationListener != null)
this.analysisProjectAuthorizationListener.authorizationUpdated(resources);
}
@Override
protected void checkAddInput(AnalysisProject entity)
{

View File

@ -84,6 +84,17 @@ public class AuthorizationServiceImpl extends AbstractMybatisEntityService<Strin
authorizationUpdated(entity.getResourceType(), entity.getResource());
}
@Override
public boolean update(Authorization entity)
{
boolean updated = super.update(entity);
if (updated)
authorizationUpdated(entity.getResourceType(), entity.getResource());
return updated;
}
@Override
public boolean deleteById(String id)
{

View File

@ -0,0 +1,56 @@
/*
* Copyright 2018 datagear.tech
*
* Licensed under the LGPLv3 license:
* http://www.gnu.org/licenses/lgpl-3.0.html
*/
package org.datagear.management.service.impl;
import java.util.Collection;
import org.datagear.management.service.AnalysisProjectAuthorizationListener;
/**
* 打包一起的{@linkplain AnalysisProjectAuthorizationListener}
*
* @author datagear@163.com
*
*/
public class BundleAnalysisProjectAuthorizationListener implements AnalysisProjectAuthorizationListener
{
private Collection<AnalysisProjectAuthorizationListener> analysisProjectAuthorizationListeners = null;
public BundleAnalysisProjectAuthorizationListener()
{
super();
}
public BundleAnalysisProjectAuthorizationListener(
Collection<AnalysisProjectAuthorizationListener> analysisProjectAuthorizationListeners)
{
super();
this.analysisProjectAuthorizationListeners = analysisProjectAuthorizationListeners;
}
public Collection<AnalysisProjectAuthorizationListener> getAnalysisProjectAuthorizationListeners()
{
return analysisProjectAuthorizationListeners;
}
public void setAnalysisProjectAuthorizationListeners(
Collection<AnalysisProjectAuthorizationListener> analysisProjectAuthorizationListeners)
{
this.analysisProjectAuthorizationListeners = analysisProjectAuthorizationListeners;
}
@Override
public void authorizationUpdated(String... analysisProjects)
{
if (this.analysisProjectAuthorizationListeners == null)
return;
for (AnalysisProjectAuthorizationListener al : this.analysisProjectAuthorizationListeners)
al.authorizationUpdated(analysisProjects);
}
}

View File

@ -232,6 +232,12 @@ public class DataSetEntityServiceImpl extends AbstractMybatisDataPermissionEntit
return pagingQueryForAnalysisProjectId(user, pagingQuery, dataFilter, analysisProjectId, true);
}
@Override
public void authorizationUpdated(String... analysisProjects)
{
permissionCacheInvalidate();
}
@Override
protected void add(DataSetEntity entity, Map<String, Object> params)
{

View File

@ -206,6 +206,12 @@ public class HtmlChartWidgetEntityServiceImpl
return pagingQueryForAnalysisProjectId(user, pagingQuery, dataFilter, analysisProjectId, true);
}
@Override
public void authorizationUpdated(String... analysisProjects)
{
permissionCacheInvalidate();
}
@Override
protected void add(HtmlChartWidgetEntity entity, Map<String, Object> params)
{

View File

@ -139,6 +139,12 @@ public class HtmlTplDashboardWidgetEntityServiceImpl
return pagingQueryForAnalysisProjectId(user, pagingQuery, dataFilter, analysisProjectId, true);
}
@Override
public void authorizationUpdated(String... analysisProjects)
{
permissionCacheInvalidate();
}
@Override
protected HtmlTplDashboardWidgetEntity postProcessGet(HtmlTplDashboardWidgetEntity obj)
{

View File

@ -50,6 +50,7 @@ import org.datagear.dataexchange.support.JsonDataImportService;
import org.datagear.dataexchange.support.SqlDataExportService;
import org.datagear.dataexchange.support.SqlDataImportService;
import org.datagear.management.dbversion.DbVersionManager;
import org.datagear.management.service.AnalysisProjectAuthorizationListener;
import org.datagear.management.service.AnalysisProjectService;
import org.datagear.management.service.AuthorizationListener;
import org.datagear.management.service.AuthorizationService;
@ -64,9 +65,11 @@ import org.datagear.management.service.SqlHistoryService;
import org.datagear.management.service.UserService;
import org.datagear.management.service.impl.AbstractMybatisDataPermissionEntityService;
import org.datagear.management.service.impl.AbstractMybatisEntityService;
import org.datagear.management.service.impl.AnalysisProjectAuthorizationListenerAware;
import org.datagear.management.service.impl.AnalysisProjectServiceImpl;
import org.datagear.management.service.impl.AuthorizationListenerAware;
import org.datagear.management.service.impl.AuthorizationServiceImpl;
import org.datagear.management.service.impl.BundleAnalysisProjectAuthorizationListener;
import org.datagear.management.service.impl.BundleAuthorizationListener;
import org.datagear.management.service.impl.DataSetEntityServiceImpl;
import org.datagear.management.service.impl.DataSetResDirectoryServiceImpl;
@ -746,6 +749,7 @@ public class CoreConfig implements ApplicationListener<ContextRefreshedEvent>
initAuthorizationResourceServices(context);
initAuthorizationListenerAwares(context);
initAnalysisProjectAuthorizationListenerAwares(context);
initServiceCaches(context);
initDevotedDataExchangeServices(context);
}
@ -775,6 +779,23 @@ public class CoreConfig implements ApplicationListener<ContextRefreshedEvent>
aware.setAuthorizationListener(listener);
}
protected void initAnalysisProjectAuthorizationListenerAwares(ApplicationContext context)
{
Map<String, AnalysisProjectAuthorizationListener> listenerMap = context
.getBeansOfType(AnalysisProjectAuthorizationListener.class);
List<AnalysisProjectAuthorizationListener> listenerList = new ArrayList<AnalysisProjectAuthorizationListener>(
listenerMap.size());
listenerList.addAll(listenerMap.values());
BundleAnalysisProjectAuthorizationListener listener = new BundleAnalysisProjectAuthorizationListener(
listenerList);
Map<String, AnalysisProjectAuthorizationListenerAware> awareMap = context
.getBeansOfType(AnalysisProjectAuthorizationListenerAware.class);
for (AnalysisProjectAuthorizationListenerAware aware : awareMap.values())
aware.setAnalysisProjectAuthorizationListener(listener);
}
@SuppressWarnings("rawtypes")
protected void initServiceCaches(ApplicationContext context)
{