Skip to content

Commit

Permalink
1차 배포 테스트 (#164)
Browse files Browse the repository at this point in the history
* ë로그이인, 프로젝트 현황, 로그인,팀시보드ã�, ,.  프로젝í,록  ã레/수정 ì록/ì

* refactor: folder_refactoring (#noissue)

* 파일 경로 수정

* menu_update

* update project path and ui (#11)

* [#13] 프로젝트 yml 구성 (#14)

* setting: secret 파일 gitignore (#13)

* setting: yml db 정보 추가 및 환경 분리 (#13)

* refactor: 공통 코드 위치 변경 및 파일 이름 변경 (#13)

* feature: secret.yml 기본 템플릿 추가 (#13)

* Update issue templates

* Create PULL_REQUEST_TEMPLATE.md

* header layout modify (#16)

* 위험 목록 UI 구현

* 로그인.jsp form태그 action 재설정_시큐리티적용전

* create issue/danger layout (#21)

* create member ui (#23)

* setting: jstl 의존성 추가 (#noissue)

* refactor: 산출물 경로 변경 (#15)

* refactor: 불필요 어노테이션 제거 (#noissue)

* feat: 산출물 관리 UI 페이지 구현 (#15)

* feat: 파일 목록 ax5-ui 추가 (#15)

* common.jsp change

* refactor: jstl 모듈 위치변경 (#noissue)

* refactor: 기본 로고 이름 변경 (#noissue)

* feat: 산출물 파일 상세 조회 로직 구현 (#28)

* feat: 산출물 파일 상세 조회 로직 구현 (#28) (#29)

* feat: 인력등록팝업화면구현(8)

* create_wbs_ui

* feat: 새 산출물 등록 로직 구현 (#28)

* feat: 공통 사용 css 추가 (#noissue)

* feat: 공통코드사용로직구현 (#31) (#36)

* feat: 공통코드사용로직구현 (#31)

* feat: dto명변경 (#31)

* feat: dto명 변경 (#37)

* feat: 권환목록 조회 서버,화면 로직 구현 (#39)

* feat: 조직도 트리구조 조회 서버 로직 구현 (#41)

* feat: 부서 선택 시 사원 목록 조회 (#43)

* [#35] 산출물 도메인 새 폴더 생성 클라이언트 모달 및 로직 구현 등 (#47)

* refactor: 사용 라이브러리 정리 (#noissue)

* feat: 산출물 관리 모달 UI 구현 (#35)

* feat: 파일 로직 구현 및 재사용 모듈 관리 (#35)

* refactor: jstree 모듈 관리 (#35)

* refactor: member_management_ui_refactor (#46)

* insert/create-project (#50)

* project_select_task

* feat: 프로젝트 팀 목록 조회 및 팀 상세 조회 (#45)

* project_select_task (#52)

* [#48] 테스트 관리 카테고리에 대한 UI를 구현 (#54)

* refactor: 사용 라이브러리 정리 (#noissue)

* feat: 산출물 관리 모달 UI 구현 (#35)

* feat: 파일 로직 구현 및 재사용 모듈 관리 (#35)

* refactor: jstree 모듈 관리 (#35)

* feat: 테스트 관리 로직 구현 (#35)

* feat:  테스트 등록, 조회 UI 및 로직 구현 (#48)

* select_project_task

* refactor: 결함 경로 추가 (#55)

* refactor: 각 변경사항 적용 (#noissue)

* feat: 결함 상세 팝업 페이지 UI, 로직 구현 (#55)

* feat: 결함 관리 페이지 UI, 로직 구현 (#55)

* feat: 결함 경로별 동적 버튼 추가 (#55)

* feat: 프로젝트 총인원 목록 조회 서버 로직 구현 (#56)

* feat: 팀 트리 구조 순서 변경 서버 로직 구현 (#63)

* project_modify_task (#66)

* feat: 팀생성화면구현 (#64)

* feat: 팀등록 디자인 변경 (#72)

* feat: css수정 (#72)

* issue_danger_modify_layout

* modify css

* refactor: 경로 수정 (#60)

* refactor: 경로 수정 (#61)

* refactor: 기본 css 스타일 변경 (#noissue)

* refactor: 의존성 정리 (#noissue)

* feat: 기본 더미 데이터 sql 추가 (#noissue)

* feat: 테스트 조회 로직 구현 중간 추가 (#60)

* feat: 팀 생성 서버 로직 구현 #(65)

* refactor: list.css 수정 (#65)

* feat: 팀원 드래그앤드롭 클라이언트 로직 구현

* modify project,wbs,issue,danger layout

* feat: 사원 팀배정 드래그앤드롭 구현 (#77)

* [#80] 프로젝트 WBS 레이아웃 구현 (#83)

* fitst create wbs layout

* modify project

* 프로젝트 update 수정 (#84)

* fitst create wbs layout

* modify project

* project update data

* update project mapper (#86)

* feat: 팀 인원 배정  서버 로직 구현 (#78)

* refactor: 프로젝트 인력 1차 병합 완료 (#87)

* refactor: 팀에 인력추가 시  무소속팀원인 경우 팀번호변경 #(87)

* refactor: 인력상세조회 시 현재 프로젝트에대해서만 팀조회 (#87)

* [#80] 프로젝트 WBS 등록 구현 (#89)

* fitst create wbs layout

* modify project

* project update data

* create_project_wbs

* [#61] 테스트 도메인 API 로직을 구현한다. (#96)

* refactor: 테스트 상세, 목록 조회 API 구현 (#60)

* refactor: 테스트 상세 조회 API 구현 (#60)

* feat: 테스트 삭제 등록 API 구현 (#92)

* refactor: data.sql 더미데이터 최신화 (#noissue)

* refactor: data.sql 더미데이터 최신화 (#noissue)

* refactor: data.sql 더미데이터 최신화 (#noissue)

* refactor: data.sql 더미데이터 최신화 (#noissue)

* refactor: data.sql 더미데이터 최신화 (#noissue)

* [#noissue] 더미데이터 최신화 (#97)

* refactor: data.sql 더미데이터 최신화 (#noissue)

* refactor: data.sql 더미데이터 최신화 (#noissue)

* refactor: data.sql 더미데이터 최신화 (#noissue)

* refactor modify project (#98)

* "refactor: 위험 공통 코드 전체 가져오는 API 구현 (#95)"

* "feat: 위험 공통 코드 화면에 표시 (#95)"

* refactor: data.sql 더미데이터 최신화 (#noissue)

* "feat: 위험 등록 페이지 시스템 계층 구조 표시 (#95)"

* refactor: data.sql 더미데이터 최신화 (#noissue)

* insert wbs

* insert wbs (#101)

* modify project

* modify layout

* "feat: 위험 등록 페이지 시스템 계층 구조 표시 (#95)"

* feat: 위험 등록dto 및 프로젝트 구조 생성 gitignore 추가 #(95)

* fix: 위험 공통코드 및 시스템 셀렉션 오류 설정(#95)

* fix: data.sql 수정 (#noissue)

* refactor: header.jsp erase comments (#noissue)

* modify design

* refactor: 위험 이슈 레이아웃 재설정 (#109)

* [#106] 결함 레이아웃 수정 (#111)

* refactor: 결함 레이아웃 개선 (#106)

* refactor: 공통 속성 common 변경 (#106)

* refactor: 산출물 경로 수정 (#noissue)

* refactor: 투입인력 페이지 레이아웃 재설정 (#113)

* create wbs (#115)

* feat: 기능 등록 UI 구현 (#108)

* feat: 공통코드 api 구현 (#117)

* refactor: 산출물 레이아웃 수정 (#112)

* refactor: 산출물 모달 레이아웃 수정 (#112)

* feat: 기능 공통코드api  UI 적용 (#117)

* [#107] 프로젝트 WBS 등록 구현 (#122)

* create wbs

* create wbs

* feat: WBS순서변경 서버로직 구현 (#123)

* [#120] 결함, 산출물 파일 레이아웃 분리 및 개선 (#126)

* refactor: 결함 상세 레이아웃 수정 (#112)

* refactor: 결함 상세 레이아웃 수정 (#112)

* refactor: 결함 상세 레이아웃 수정 (#112)

* feature_layout (#127)

* [#128] 파일 업로드 API 구현 (#129)

* feat: s3 파일 업로드 로직 추가 (#128)

* setting: s3 의존성 추가 (#128)

* refactor: file 관계 변경 적용 (#128)

* feat: 파일 업로드 api 구현 (#128)

* feat: 파일 업로드 api 구현 (#128)

* feat: 산출물 등록 로직 중간 적용 (#128)

* wbs_feature_popup_layout_modify

* feat: 팀 트리 생성 (#132) (#134)

* refactor: 파일 업로드 로직 수정 (#128) (#135)

* 팀 트리 구조 인려 선택 팝업(#121)

* refactor: 팀 트리 구조 인력 등록 팝업 수정 (#137)

* refactor: 탭버튼 css 추가 (#noissue)

* [#138] 결함 등록 API 중간 적용 (#141)

* feat: 결함 등록 api 중간 적용 (#138)

* refactor: 파일 업로드 api 수정 (#noissue)

* feat: 기능 등록 클라이언트 로직 구현 완료 (#140)

* [#138] 결함 등록 로직 중간 적용 (#142)

* feat: 결함 등록 api 중간 적용 (#138)

* refactor: 파일 업로드 api 수정 (#noissue)

* feat: 결함 등록 로직 중간 적용 (#138)

* refactor: 결함 테이블 컬럼명 수정 (#138)

* feat: 파일 삭제 로직 추가 (#noissue)

* create_update_delete_wbs (#143)

* feat: 기능 생성 서버 로직 구현 (#140)

* fix: data.sql 수정 (#noissue)

* [#138] 결함 등록 API 구현 (#147)

* feat: 결함 등록 api 중간 적용 (#138)

* refactor: 파일 업로드 api 수정 (#noissue)

* feat: 결함 등록 로직 중간 적용 (#138)

* refactor: 결함 테이블 컬럼명 수정 (#138)

* feat: 파일 삭제 로직 추가 (#noissue)

* feat: 결함 등록 api 구현 (#138)

* refactor: 파일 업로드 로직 개선 (#noissue)

* refactor: 테스트 속성 카멜케이스 적용(#noissue)

* fix: 기능 등록 팝업 시스템 선택 박스 추가(#145)

* fix: 시스템 업무명 ellipsis 처리(#145)

* [#146] 로그인 시큐리티 구현 (#150)

* create login

* modify login

* update_recent_project (#152)

* create feature layout (#154)

* feat: 기능 진척률 도넛차트 추가 (#156) (#157)

* refacotr: 도넛프로그레스바 적용(#158)

* [#148] 결함 관리 도메인 API 구현 (#161)

* refactor: 직관성을 위한 메퍼 위치 변경 (#noissue)

* refactor: 직관성을 위한 메퍼 위치 변경 (#noissue)

* refactor: 파일 로직 개선 (#148)

* refactor: 파일 로직 개선 (#148)

* refactor: 메퍼 조회 경로 추가 (#148)

* feat: 결함 API 로직 구현 (#148)

* feat: 결함 API 로직 구현 (#148)

* feat: 공통 환경변수 관리 소스 추가 (#148)

* refactor: 팝업창 크기 조절 (#148)

* modify_login_wbs (#162)

---------

Co-authored-by: hanheeland <[email protected]>
Co-authored-by: Hanhee Lee <[email protected]>
Co-authored-by: kkyh99 <[email protected]>
Co-authored-by: kimyeonho <[email protected]>
  • Loading branch information
5 people authored Oct 24, 2024
1 parent d736610 commit 16fcc10
Show file tree
Hide file tree
Showing 201 changed files with 23,649 additions and 11 deletions.
16 changes: 16 additions & 0 deletions .github/ISSUE_TEMPLATE/기본-이슈-템플릿.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
name: 기본 이슈 템플릿
about: 기본 이슈 템플릿 입니다.
title: ''
labels: ''
assignees: ''

---

## 작업 상세 내용
- 상세 내용 1
- 상세 내용 2
- 상세 내용 3

## 기타
- 기타 고려해야 할 사항을 명시
10 changes: 10 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# 작업 내용
- 작업 1
- 작업 2

# To Reviewers

# Screen Shot (선택)

# Issue
- resolved: #[이슈번호]
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,8 @@ build/

### VS Code ###
.vscode/

### yml ###
*-secret.yml

.metadata
113 changes: 102 additions & 11 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,25 +30,31 @@
<java.version>17</java.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<!-- DB -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
Expand All @@ -60,22 +66,86 @@
<artifactId>ojdbc11</artifactId>
<scope>runtime</scope>
</dependency>

<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<!-- Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<!-- JSP -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>10.1.19</version>
</dependency>

<!--JSTL-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.3</version>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>3.0.1</version>
</dependency>

<!-- security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
</dependency>

<!-- query log -->
<!-- 쿼리 로그 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>

<!-- s3 -->
<dependency>
<groupId>io.awspring.cloud</groupId>
<artifactId>spring-cloud-starter-aws</artifactId>
<version>2.4.4</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.1</version>
</dependency>

</dependencies>

<build>
Expand All @@ -92,7 +162,28 @@
</excludes>
</configuration>
</plugin>

<!-- Jacoco -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>

</plugins>
</build>

</project>
54 changes: 54 additions & 0 deletions src/main/java/com/kcc/pms/auth/PrincipalDetail.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.kcc.pms.auth;

import com.kcc.pms.domain.member.model.vo.MemberVO;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.List;

@Data
public class PrincipalDetail implements UserDetails {
private MemberVO member;

public PrincipalDetail(MemberVO member) {
this.member = member;
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return List.of();
}

@Override
public String getPassword() {
return member.getPw();
}

@Override
public String getUsername() {
return member.getId();
}

@Override
public boolean isAccountNonExpired() {
return true;
}

@Override
public boolean isAccountNonLocked() {
return true;
}

@Override
public boolean isCredentialsNonExpired() {
return true;
}

@Override
public boolean isEnabled() {
return true;
}

}
24 changes: 24 additions & 0 deletions src/main/java/com/kcc/pms/auth/PrincipalDetailService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.kcc.pms.auth;

import com.kcc.pms.domain.member.mapper.MemberMapper;
import com.kcc.pms.domain.member.model.vo.MemberVO;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class PrincipalDetailService implements UserDetailsService {
private final MemberMapper memberMapper;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
MemberVO member = memberMapper.findById(username);
if (member != null) {
return new PrincipalDetail(member);
}
return null;
}
}
106 changes: 106 additions & 0 deletions src/main/java/com/kcc/pms/auth/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package com.kcc.pms.auth;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
import org.springframework.security.web.firewall.HttpFirewall;
import org.springframework.security.web.firewall.StrictHttpFirewall;

import java.io.IOException;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Bean
public BCryptPasswordEncoder encodePwd() {
return new BCryptPasswordEncoder();
}

// @Bean
// public PasswordEncoder passwordEncoder() {
// return NoOpPasswordEncoder.getInstance();
// }

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf(csrf -> csrf
.ignoringRequestMatchers("/**") // 모든 경로에 대해 기본적으로 CSRF 비활성화
.requireCsrfProtectionMatcher(request -> {
String uri = request.getRequestURI();
return uri.equals("/loginForm"); // 로그인 페이지에서만 CSRF 활성화
})
);
http.authorizeHttpRequests(authorizeRequests ->
authorizeRequests
.requestMatchers("/projects/**").authenticated()
.requestMatchers(request -> "XMLHttpRequest".equals(request.getHeader("X-Requested-With"))).permitAll()
.anyRequest().permitAll()
).formLogin(formLogin -> formLogin.loginPage("/loginForm") // 로그인 페이지 지정
.loginProcessingUrl("/login") // 컨트롤러 지정 없이 시큐리티에서 로그인 진행
.successHandler((request, response, authentication) -> {
String prevPage = (String) request.getSession().getAttribute("prevPage");
if (prevPage != null) {
response.sendRedirect(prevPage);
} else {
SavedRequestAwareAuthenticationSuccessHandler defaultHandler = new SavedRequestAwareAuthenticationSuccessHandler();
defaultHandler.setDefaultTargetUrl("/projects/list?type=projectList"); // 기본 경로 설정
defaultHandler.onAuthenticationSuccess(request, response, authentication);
}
})
.failureHandler(authenticationFailureHandler())) // 로그인 실패 시 처리할 핸들러 설정
.logout(logout -> logout
.logoutUrl("/logout") // 로그아웃 요청 경로
.logoutSuccessUrl("/loginForm") // 로그아웃 성공 시 이동할 경로
.invalidateHttpSession(true)
)
.headers(headers -> headers
.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin)) // 보안 헤더 설정 추가
// 인증되지 않은 AJAX 요청에 대해 401 반환
.exceptionHandling(exceptionHandling -> exceptionHandling
.authenticationEntryPoint((request, response, authException) -> {
// AJAX 요청 여부 확인
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
// AJAX 요청에 대해서는 401 Unauthorized 상태 코드 반환
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setContentType("application/json");
response.getWriter().write("{\"error\": \"Unauthorized\", \"loginUrl\": \"/members/loginForm\"}");
} else {
// 일반 요청에 대해서는 로그인 페이지로 리디렉션
response.sendRedirect("/loginForm");
}
})
);

return http.build();
}

@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
firewall.setAllowUrlEncodedDoubleSlash(true); // 이중 슬래시 허용
return firewall;
}

@Bean
public AuthenticationFailureHandler authenticationFailureHandler() {
return new SimpleUrlAuthenticationFailureHandler() {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, IOException {
// 로그인 실패 시 메시지를 설정하고 리디렉션
response.sendRedirect("/loginForm?error=true");
}
};
}
}
Loading

0 comments on commit 16fcc10

Please sign in to comment.