|
@@ -18,9 +18,16 @@
|
|
package org.hswebframework.web.authorization;
|
|
package org.hswebframework.web.authorization;
|
|
|
|
|
|
import org.hswebframework.web.authorization.access.DataAccessConfig;
|
|
import org.hswebframework.web.authorization.access.DataAccessConfig;
|
|
|
|
+import org.hswebframework.web.authorization.access.FieldFilterDataAccessConfig;
|
|
|
|
+import org.hswebframework.web.authorization.access.ScopeDataAccessConfig;
|
|
|
|
|
|
import java.io.Serializable;
|
|
import java.io.Serializable;
|
|
|
|
+import java.util.Collections;
|
|
|
|
+import java.util.Optional;
|
|
import java.util.Set;
|
|
import java.util.Set;
|
|
|
|
+import java.util.function.Predicate;
|
|
|
|
+
|
|
|
|
+import static org.hswebframework.web.authorization.access.DataAccessConfig.DefaultType.DENY_FIELDS;
|
|
|
|
|
|
/**
|
|
/**
|
|
* 用户持有的权限信息,包含了权限基本信息、可操作范围(action)、行,列级权限控制规则。
|
|
* 用户持有的权限信息,包含了权限基本信息、可操作范围(action)、行,列级权限控制规则。
|
|
@@ -34,15 +41,15 @@ public interface Permission extends Serializable {
|
|
/**
|
|
/**
|
|
* 查询
|
|
* 查询
|
|
*/
|
|
*/
|
|
- String ACTION_QUERY = "query";
|
|
|
|
|
|
+ String ACTION_QUERY = "query";
|
|
/**
|
|
/**
|
|
* 获取明细
|
|
* 获取明细
|
|
*/
|
|
*/
|
|
- String ACTION_GET = "get";
|
|
|
|
|
|
+ String ACTION_GET = "get";
|
|
/**
|
|
/**
|
|
* 新增
|
|
* 新增
|
|
*/
|
|
*/
|
|
- String ACTION_ADD = "add";
|
|
|
|
|
|
+ String ACTION_ADD = "add";
|
|
/**
|
|
/**
|
|
* 更新
|
|
* 更新
|
|
*/
|
|
*/
|
|
@@ -77,14 +84,121 @@ public interface Permission extends Serializable {
|
|
String getId();
|
|
String getId();
|
|
|
|
|
|
/**
|
|
/**
|
|
- * @return 用户对此权限的可操作事件(按钮)
|
|
|
|
|
|
+ * 用户对此权限的可操作事件(按钮)
|
|
|
|
+ * <p>
|
|
|
|
+ * ⚠️:任何时候都不应该对返回的Set进行写操作
|
|
|
|
+ *
|
|
|
|
+ * @return 如果没有配置返回空{@link Collections#emptySet()},不会返回null.
|
|
*/
|
|
*/
|
|
Set<String> getActions();
|
|
Set<String> getActions();
|
|
|
|
|
|
/**
|
|
/**
|
|
- * @return 用户对此权限持有的数据权限信息, 用于数据级别的控制
|
|
|
|
|
|
+ * 用户对此权限持有的数据权限信息, 用于数据级别的控制
|
|
|
|
+ * <p>
|
|
|
|
+ * ⚠️:任何时候都不应该对返回的Set进行写操作
|
|
|
|
+ *
|
|
|
|
+ * @return 如果没有配置返回空{@link Collections#emptySet()},不会返回null.
|
|
* @see DataAccessConfig
|
|
* @see DataAccessConfig
|
|
* @see org.hswebframework.web.authorization.access.DataAccessController
|
|
* @see org.hswebframework.web.authorization.access.DataAccessController
|
|
*/
|
|
*/
|
|
Set<DataAccessConfig> getDataAccesses();
|
|
Set<DataAccessConfig> getDataAccesses();
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查找数据权限配置
|
|
|
|
+ *
|
|
|
|
+ * @param configPredicate 数据权限配置匹配规则
|
|
|
|
+ * @param <T> 数据权限配置类型
|
|
|
|
+ * @return {@link Optional}
|
|
|
|
+ * @see this#scope(String, String, String)
|
|
|
|
+ */
|
|
|
|
+ @SuppressWarnings("all")
|
|
|
|
+ default <T extends DataAccessConfig> Optional<T> findDataAccess(DataAccessPredicate<T> configPredicate) {
|
|
|
|
+ return (Optional) getDataAccesses().stream()
|
|
|
|
+ .filter(configPredicate)
|
|
|
|
+ .findFirst();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查找字段过滤的数据权限配置(列级数据权限),比如:不查询某些字段
|
|
|
|
+ *
|
|
|
|
+ * @param action 权限操作类型 {@link Permission#ACTION_QUERY}
|
|
|
|
+ * @return {@link Optional}
|
|
|
|
+ * @see FieldFilterDataAccessConfig
|
|
|
|
+ * @see FieldFilterDataAccessConfig#getFields()
|
|
|
|
+ */
|
|
|
|
+ default Optional<FieldFilterDataAccessConfig> findFieldFilter(String action) {
|
|
|
|
+ return findDataAccess(conf -> FieldFilterDataAccessConfig.class.isInstance(conf) && conf.getAction().equals(action));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取不能执行操作的字段
|
|
|
|
+ *
|
|
|
|
+ * @param action 权限操作
|
|
|
|
+ * @return 未配置时返回空set, 不会返回null
|
|
|
|
+ */
|
|
|
|
+ default Set<String> findDenyFields(String action) {
|
|
|
|
+ return findFieldFilter(action)
|
|
|
|
+ .filter(conf -> conf.getType().equals(DENY_FIELDS))
|
|
|
|
+ .map(FieldFilterDataAccessConfig::getFields)
|
|
|
|
+ .orElseGet(Collections::emptySet);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 查找数据范围权限控制配置(行级数据权限),比如: 只能查询本机构的数据
|
|
|
|
+ *
|
|
|
|
+ * @param type 范围类型标识,由具体的实现定义,如: 机构范围
|
|
|
|
+ * @param scopeType 范围类型,由具体的实现定义,如: 只能查看自己所在机构
|
|
|
|
+ * @param action 权限操作 {@link Permission#ACTION_QUERY}
|
|
|
|
+ * @return 未配置时返回空set, 不会返回null
|
|
|
|
+ */
|
|
|
|
+ default Set<Object> findScope(String action, String type, String scopeType) {
|
|
|
|
+ return findScope(scope(action, type, scopeType));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ default Set<Object> findScope(Permission.DataAccessPredicate<ScopeDataAccessConfig> predicate) {
|
|
|
|
+ return findDataAccess(predicate)
|
|
|
|
+ .map(ScopeDataAccessConfig::getScope)
|
|
|
|
+ .orElseGet(Collections::emptySet);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 构造一个数据范围权限控制配置查找逻辑
|
|
|
|
+ *
|
|
|
|
+ * @param type 范围类型标识,由具体的实现定义,如: 机构范围
|
|
|
|
+ * @param scopeType 范围类型,由具体的实现定义,如: 只能查看自己所在机构
|
|
|
|
+ * @param action 权限操作 {@link Permission#ACTION_QUERY}
|
|
|
|
+ * @return {@link DataAccessPredicate}
|
|
|
|
+ */
|
|
|
|
+ static Permission.DataAccessPredicate<ScopeDataAccessConfig> scope(String action, String type, String scopeType) {
|
|
|
|
+ return config ->
|
|
|
|
+ config instanceof ScopeDataAccessConfig
|
|
|
|
+ && config.getAction().equals(action)
|
|
|
|
+ && config.getType().equals(type)
|
|
|
|
+ && ((ScopeDataAccessConfig) config).getScopeType().equals(scopeType);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 数据权限查找判断逻辑接口
|
|
|
|
+ *
|
|
|
|
+ * @param <T>
|
|
|
|
+ */
|
|
|
|
+ interface DataAccessPredicate<T extends DataAccessConfig> extends Predicate<DataAccessConfig> {
|
|
|
|
+ boolean test(DataAccessConfig config);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ default DataAccessPredicate<T> and(Predicate<? super DataAccessConfig> other) {
|
|
|
|
+ return (t) -> test(t) && other.test(t);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ default DataAccessPredicate<T> or(Predicate<? super DataAccessConfig> other) {
|
|
|
|
+ return (t) -> test(t) || other.test(t);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|