提交 26d28b2f 编写于 作者: 街头小贩's avatar 街头小贩

增加ConfigStrategyChain

上级 1da4cc0e
......@@ -40,7 +40,7 @@ public abstract class AbstractDetectionStrategy<T> {
* @throws VerificaFailException
*/
public ComplexDetectionStrategy<T> detect(T entitiy, Member member, ForumActionEnum forumAction, Set<MemberRoleEnum> actionAllowRoles)throws VerificaFailException{
DetectionStrategyChain<T> dsc = DetectionStrategyChain.<T>begin()
DetectionStrategyChain<T> dsc = DetectionStrategyChain.<T>start()
.entity(getEntityStrategy(), ImmutablePair.of(entitiy, forumAction))
.member(getMemberCondition(), member)
.action(getActionCondition(), ImmutableTriple.of(member, forumAction, actionAllowRoles));
......@@ -99,8 +99,7 @@ public abstract class AbstractDetectionStrategy<T> {
if (ForumActionEnum.POSTS_EDIT == action) { // 作者和版主都可以
return false;
}
Set<ForumActionEnum> ma = ForumActionEnum.getModeratorActions();
return ma.contains(action);
return ForumActionEnum.getModeratorActions().contains(action);
}
private static boolean isContinueManagerAction(ForumActionEnum action, MemberRoleEnum memberRole) {
......
......@@ -15,7 +15,7 @@ import org.apache.commons.lang3.tuple.ImmutableTriple;
/**
* 检测器执行链,并封装执行结果
*
* @param <T>
* @param <T> 实体类型参数
* @author xiaofanku
* @since 20200805
*/
......@@ -28,12 +28,12 @@ public final class DetectionStrategyChain<T> {
this.exception = exception;
}
public static <T> DetectionStrategyChain<T> begin() {
public static <T> DetectionStrategyChain<T> start() {
return new DetectionStrategyChain<>(true, null);
}
/**
*
* @param entityStrategy 实体检查策略
* @param entityStrategy 实体谓词函数
* @param argument 检查策略参数
* @return
*/
......@@ -53,7 +53,7 @@ public final class DetectionStrategyChain<T> {
}
/**
*
* @param memberStrategy 操作者/会员检查策略
* @param memberStrategy 操作者/会员检谓词函数
* @param operator 操作者/会员
* @return
*/
......@@ -73,7 +73,7 @@ public final class DetectionStrategyChain<T> {
}
/**
*
* @param actionStrategy 操作权限检查策略
* @param actionStrategy 操作权限谓词函数
* @param argument 检查策略参数
* @return
*/
......
......@@ -7,6 +7,8 @@ import com.apobates.forum.member.entity.Member;
import com.apobates.forum.utils.lang.TriPredicate;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.ImmutableTriple;
/**
* 抽像的实现配置文件策略
......@@ -51,6 +53,7 @@ public abstract class AbstractConfigStrategy<T, C> {
* @throws StrategyException
*/
public ComplexConfigStrategyExector<T,C> initial(C entityConfig, T entity, StrategyMode mode, Member culpritor)throws StrategyException{
/* 这种写法有撒问题?
try{
boolean symbol = checkConfig().test(entityConfig) && checkEntity().test(entity, mode) && checkCulpritor().test(entityConfig, culpritor, mode);
if(symbol){
......@@ -59,6 +62,14 @@ public abstract class AbstractConfigStrategy<T, C> {
}catch(StrategyException e){
throw e;
}
throw new StrategyException("初步检测失败");
throw new StrategyException("初步检测失败");*/
ConfigStrategyChain<T,C> csc = ConfigStrategyChain.<T,C>start()
.config(checkConfig(), entityConfig)
.entity(checkEntity(), ImmutablePair.of(entity, mode))
.culpritor(checkCulpritor(), ImmutableTriple.of(entityConfig, culpritor, mode));
if(csc.getBreakException().isPresent()){
throw csc.getBreakException().get();
}
return new ComplexConfigStrategyExector<>(culpritor, entity, mode, entityConfig);
}
}
\ No newline at end of file
package com.apobates.forum.core.security.exposure.config;
import com.apobates.forum.core.security.exception.StrategyException;
import com.apobates.forum.core.security.exception.VerificaFailException;
import com.apobates.forum.core.security.exposure.DetectionStrategyChain;
import com.apobates.forum.core.security.strategy.StrategyMode;
import com.apobates.forum.member.entity.Member;
import com.apobates.forum.utils.lang.TriPredicate;
import java.util.Optional;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.ImmutableTriple;
/**
* 配置文件策略执行链,并封装执行结果
*
* @param <T> 实体类型参数
* @param <C> 实体配置文件类型参数
* @author xiaofanku
* @since 20200828
*/
public final class ConfigStrategyChain<T, C> {
private final boolean result;
private final StrategyException exception;
private ConfigStrategyChain(boolean result, StrategyException exception) {
this.result = result;
this.exception = exception;
}
public static <T,C> ConfigStrategyChain<T,C> start() {
return new ConfigStrategyChain<>(true, null);
}
/**
*
* @param configFunction 配置文件谓词函数
* @param config 实体配置文件
* @return
*/
public ConfigStrategyChain<T,C> config(Predicate<C> configFunction, C config){
if(!isContinue()){
return this;
}
//
try{
if(configFunction.test(config)){
return new ConfigStrategyChain<>(true, null);
}
}catch(StrategyException e){
return new ConfigStrategyChain<>(false, e);
}
return new ConfigStrategyChain<>(false, new StrategyException("实体配置文件检测失败"));
}
/**
*
* @param entityFunction 实体谓词函数
* @param argument 实体谓词函数参数
* @return
*/
public ConfigStrategyChain<T,C> entity(BiPredicate<T, StrategyMode> entityFunction, ImmutablePair<T, StrategyMode> argument){
if(!isContinue()){
return this;
}
//
try{
if(entityFunction.test(argument.getLeft(), argument.getRight())){
return new ConfigStrategyChain<>(true, null);
}
}catch(StrategyException e){
return new ConfigStrategyChain<>(false, e);
}
return new ConfigStrategyChain<>(false, new StrategyException("实体检测失败"));
}
/**
*
* @param culpritorFunction 操作者/会员检谓词函数
* @param argument 操作者/会员检谓词函数参数
* @return
*/
public ConfigStrategyChain<T,C> culpritor(TriPredicate<C, Member, StrategyMode> culpritorFunction, ImmutableTriple<C, Member, StrategyMode> argument){
if(!isContinue()){
return this;
}
//
try{
if(culpritorFunction.test(argument.getLeft(), argument.getMiddle(), argument.getRight())){
return new ConfigStrategyChain<>(true, null);
}
}catch(StrategyException e){
return new ConfigStrategyChain<>(false, e);
}
return new ConfigStrategyChain<>(false, new StrategyException("操作者检测失败"));
}
public boolean isContinue() {
return result;
}
public Optional<StrategyException> getBreakException() {
return Optional.ofNullable(exception);
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册