# 인증 & 권한 검사 애노테이션 Yobi에서 애노테이션을 사용하여 프로젝트의 특정 리소스 접근 권한 및 익명 사용자 접근을 확인하는 방법을 설명한다. ## 인증 & 권한 애노테이션 Yobi에서 사용하는 인증 및 권한과 관련있는 애노테이션은 다음과 같다: * `@IsOnlyGitAvailable` * `@IsCreatable` * `@IsAllowed` * `@With(AnonymousCheckAction.class)` * `@With(NullProjectCheckAction.class)` * `@With(DefaultProjectCheckAction.class)` Yobi에서 사용하는 인증 및 권한 검사 애노테이션은 다음과 같은 URL 패턴에만 적용할 수 있다. `/loginId/projectName/**` `conf/application.conf`에 설정한 application.context가 있을 경우 해당 컨텍스트 패스를 제거한 URL 패턴에 적용된다. ## @With(DefaultProjectCheckAction.class) 이 애노테이션은 URL 패턴에 해당하는 프로젝트가 있는지 그리고 해당 프로젝트를 볼 수 있는 권한이 있는지 확인한다. URL에 해당하는 프로젝트가 없거나 현재 사용자가 읽기 권한이 없을 때 403 Forbidden으로 응답한다. ### 사용 예 다음 코드는 URL 패턴에 해당하는 프로젝트가 있는지 확인한다. ``` @With(DefaultProjectCheckAction.class) public static Result editIssue(String ownerName, String projectName, Long number) { // 코드 생략 } ``` ## @IsOnlyGitAvailable `@With(DefaultProjectCheckAction.class)`가 확인하는 작업에 추가로 GIT 저장소를 사용하는 프로젝트인지 확인한다. URL에 해당하는 프로젝트가 없거나 현재 사용자가 읽기 권한이 없을 때 403 Forbidden으로 응답한다. URL에 해당하는 프로젝트가 GIT 저장소를 사용하지 않는 프로젝트일 경우에는 응답으로 400 Bad Request를 반환한다. 컨트롤러 클래스에 이 애노테이션을 사용하면 해당 컨트롤러의 모든 메서드에 적용된다. ### 사용 예 다음 코드는 PullRequestApp 컨트롤러의 모든 메서드에 @IsOnlyGitAvailable을 적용하여 이 컨트롤러에서 처리하는 모든 요청은 GIT 저장소를 가진 프로젝트에 대해서만 동작한다고 설정한 것이다. ``` @IsOnlyGitAvailable public class PullRequestApp extends Controller { // 핸들러 메서드 생략 } ``` ## @IsCreatable `@With(DefaultProjectCheckAction.class)`가 확인하는 작업에 추가로 현재 사용자가 프로젝트에 특정 리소스 타입을 생성할 수 있는지 확인한다. 다음의 경우 403 Forbidden으로 응답한다. * URL에 해당하는 프로젝트가 없다. * URL에 해당하는 프로젝트에 현재 사용자가 읽기 권한이 없다. * URL에 해당하는 프로젝트에 해당 리소스를 생성할 권한이 없다. ### 파라미터 * value: 생성 권한을 확인하려는 리소스 타입으로 `ResourceType`을 입력한다. ### 사용 예 위 코드는 현재 로그인한 사용자가 URL 패턴에 해당하는 프로젝트에 BOARD_POST 타입의 리소스를 생성할 수 있는 권한이 있는지 확인한다. ``` @IsCreatable(ResourceType.BOARD_POST) public static Result newPostForm(String userName, String projectName) { // 코드 생략 } ``` ## @IsAllowed `@With(DefaultProjectCheckAction.class)`가 확인하는 작업에 추가로 현재 사용자가 특정 리소스에 특정 권한이 가능한지 확인한다. 다음의 경우 403 Forbidden으로 응답한다. * URL에 해당하는 프로젝트가 없다. * URL에 해당하는 프로젝트에 현재 사용자가 읽기 권한이 없다. * 현재 사용자에게 특정 리소스(`ResourceType`)에 특정 동작(`Operation`)을 허용하지 않는다. ### 파라미터 * value: 확인하려는 권한으로 `Operation`을 입력한다. * resourceType: 권한을 확인하려는 리소스 타입으로 `ResourceType`을 입력한다. 기본값은 PROJECT. ### 주의 이 애노테이션에서 사용할 수 있는 `ResourceType`은 제한되어 있다. 즉, 모든 리소스 타입을 지원하진 않는다. 현재 지원하는 리소스 타입은 다음과 같다. * PROJECT * MILESTONE * BOARD_POST * ISSUE_POST * ISSUE_LAVEL * PULL_REQUEST * COMMIT_COMMENT 이밖에 필요한 리소스 타입이 있다면 `Resource.getResourceObject` 메서드에 코드를 추가해야 한다. ### 사용 예 다음 코드는 resourceType을 명시하지 않았기 때문에 기본값인 PROJECT가 적용되어 현재 사용자가 PROJECT 리소스 타입에 READ 권한이 있는지 확인한다. ``` @IsAllowed(Operation.READ) public static Result issues(String ownerName, String projectName, String state, String format, int pageNum) throws WriteException, IOException { // 코드 생략 } ``` 다음 코드는 현재 사용자가 BOARD_POST, 즉 게시물에 대한 UPDATE 권한이 있는지 확인한다. ``` @IsAllowed(value = Operation.UPDATE, resourceType = ResourceType.BOARD_POST) public static Result editPostForm(String owner, String projectName, Long number) { // 코드 생략 } ``` ## @With(AnonymousCheckAction.class) 이 애노테이션은 익명 사용자의 요청인지 확인한다. 현재 요청한 사용자가 익명 사용자일 경우에 alert 창을 보여주고 로그인 폼으로 이동시킨다. ### 사용 예 다음 코드는 로그인한 사용자가 있는지 확인한다. ``` @With(AnonymousCheckAction.class) public static Result userIssues(String state, String format, int pageNum) { // 코드 생략 } ``` ## @With(NullProjectCheckAction.class) 이 애노테이션은 URL 패턴에 해당하는 프로젝트가 있는지 확인한다. URL에 해당하는 프로젝트가 없을 때 403 Forbidden으로 응답한다. ### 사용 예 다음 코드는 URL 패턴에 해당하는 프로젝트가 있는지 확인한다. ``` @With(NullProjectCheckAction.class) public static Result enroll(String loginId, String projectName) { // 코드 생략 } ```