Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ dependencies {
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// hibernate snowflake
implementation 'org.hibernate:hibernate-core:5.6.4.Final'
implementation group: 'io.vavr', name: 'vavr', version: '0.10.4'

}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.econovation.fourth_project.policy.common;

import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicLong;

@Component
public class AutoIncrement {
private AtomicLong id = new AtomicLong(1);

public Long autoIncrement() {
return id.getAndIncrement();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.econovation.fourth_project.policy.common;

// HttpMethod GET,PUT,POST,DELETE만 허용
public enum HttpMethod {
GET,
PUT,
POST,
DELETE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.econovation.fourth_project.policy.common;

public class StaticMessage {
public static String SUCCESS_CREATE_POLICY = "정책을 생성하였습니다.";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.econovation.fourth_project.policy.controller;

import com.econovation.fourth_project.policy.common.StaticMessage;
import com.econovation.fourth_project.policy.dto.request.CheckResourceRequest;
import com.econovation.fourth_project.policy.dto.request.CreatePolicyRequest;
import com.econovation.fourth_project.policy.servicce.CreatePolicyUseCase;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class PolicyController {
private final CreatePolicyUseCase createPolicyUseCase;

@PostMapping("/policy")
public ResponseEntity<String> createPolicy(@RequestBody CreatePolicyRequest request) {
createPolicyUseCase.execute(request);
return ResponseEntity.ok(StaticMessage.SUCCESS_CREATE_POLICY);
}

@GetMapping("/check/resource/{resource}")
public ResponseEntity<Boolean> checkResource(@RequestBody CheckResourceRequest request, @PathVariable String resource) {

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.econovation.fourth_project.policy.database;

import com.econovation.fourth_project.policy.common.AutoIncrement;
import com.econovation.fourth_project.policy.domain.Policy;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
@RequiredArgsConstructor
public class Database {
private final AutoIncrement autoIncrement;
private Map<Long, Policy> policyTb = new ConcurrentHashMap<>();

public Policy savePolicy(Policy policy) {
Long id = autoIncrement.autoIncrement();
policyTb.put(id,policy);
policy.setId(id);
return policy;
}

public List<Policy> findByResource(String resource) {
return policyTb.values().stream()
.filter(policy -> policy.getStatement().getResource().split(":").(resource))
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.econovation.fourth_project.policy.domain;

public enum Effect {
Allow,
Deny
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.econovation.fourth_project.policy.domain;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;
@Getter
@Setter
public class Policy {
private Long id;
private LocalDate version;
private Statement statement;

public static Policy createPolicy(LocalDate version, Statement statement){
return new Policy(version,statement);
}

public Policy(LocalDate version, Statement statement) {
this.version = version;
this.statement = statement;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.econovation.fourth_project.policy.domain;

import lombok.Getter;

import java.util.Map;
@Getter
public class Statement {
private String sid;
private Effect effect;
private Map<String,String> action;
private Map<String,String> notAction;
private String Resource;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.econovation.fourth_project.policy.dto.request;

public record CheckResourceRequest(String httpMethod) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.econovation.fourth_project.policy.dto.request;

import com.econovation.fourth_project.policy.domain.Statement;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;

import java.time.LocalDate;
public record CreatePolicyRequest(@JsonFormat(pattern = "yyyy-MM-dd") LocalDate version, Statement statement) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.econovation.fourth_project.policy.servicce;

import com.econovation.fourth_project.policy.database.Database;
import com.econovation.fourth_project.policy.domain.Effect;
import com.econovation.fourth_project.policy.domain.Policy;
import com.econovation.fourth_project.policy.dto.request.CheckResourceRequest;
import io.vavr.control.Either;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

import static java.util.stream.Collectors.groupingBy;

@Component
@RequiredArgsConstructor
public class CheckResourceUseCase {
private final Database database;

public Boolean execute(CheckResourceRequest request, String resource) {
Either<Policy,Policy> policy = findByResource(resource);
policy.fold(

)
}

/**
* Either<Deny,Allow>
*/
private Either<Policy,Policy> findByResource(String resource) {
List<Policy> policies = database.findByResource(resource);
Map<Effect,List<Policy>> groupByEffect = policies.stream().collect(groupingBy(policy -> policy.getStatement().getEffect()));
if(groupByEffect.containsKey(Effect.Deny))
// stream.findFirst나 findAny보다 그냥 0번째 인덱스 가져 오는게 더 성능상 좋을 것 같다.
return Either.left(groupByEffect.get(Effect.Deny).get(0));
else
return Either.right(groupByEffect.get(Effect.Allow).get(0));
}
// Effect가 Deny인 경우
private boolean checkAction()


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.econovation.fourth_project.policy.servicce;

import com.econovation.fourth_project.policy.database.Database;
import com.econovation.fourth_project.policy.domain.Policy;
import com.econovation.fourth_project.policy.dto.request.CreatePolicyRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class CreatePolicyUseCase {
private final Database database;

public void execute(CreatePolicyRequest request) {
Policy policy = Policy.createPolicy(request.version(), request.statement());
database.savePolicy(policy);
}
}