# 인증 - Authorization

Authorization

#### 설명

권한 부여는 사용자가 응용 프로그램에서 특정 작업을 수행 할 수 있는지 확인하는 데 사용됩니다. Axs는 권한을 구현하기 위한 **롤 기반** 기능을 제공합니다.

![Alt text](/files/0zXkbzBqzzhwN6durENj)

**IPermissionChecker**

권한 부여 시스템은 **IPermissionChecker**를 사용하여 권한을 확인합니다.

#### 권한 정의

**권한**이 필요한 각 작업에 대해 고유 한 권한이 정의됩니다. Axs는 모듈 식으로 설계 되었으므로 모듈([modular](https://github.com/axuslab/docs.axs/blob/main/Developments/Module_System/README.md))마다 다른 권한을 가질 수 있습니다. 모듈은 권한을 정의하기 위해 **AuthorizationProvider**에서 파생 된 클래스를 만들어야 합니다.

```csharp
public class MyAuthorizationProvider : AuthorizationProvider
{
    public override void SetPermissions(IPermissionDefinitionContext context)
    {
        // administration 권한 부여
        var administration = context.CreatePermission("관리자");

        // administration 하위 권한 부여
        var userManagement = administration.CreateChildPermission("관리자.사용자관리");
        userManagement.CreateChildPermission("관리자.사용자관리.추가");

        var roleManagement = administration.CreateChildPermission("관리자.역할관리");
    }
}
```

권한은 다음 속성으로 정의됩니다 :

* **Name**: 시스템 전체에서 **고유**한 이름입니다. 권한 이름에 대한 const 문자열을 정의하는 것이 좋습니다.
* **Display name**: 나중에 UI에서 권한을 표시하는 데 사용할 수 있는 다국어 가능한 문자열 키입니다.
* **Description**: 나중에 UI에서 권한 정의를 표시하는 데 사용할 수 있는 다국어 가능한 문자열 키입니다.
* **MultiTenancySides**: 다중 테넌트 애플리케이션의 경우 테넌트 또는 호스트가 권한을 사용할 수 있습니다.

권한은 상위 및 하위 권한을 가질 수 있습니다. 이는 권한 검사에 영향을주지 않지만 UI에서 권한을 그룹화하는 데 도움이됩니다.

권한 부여 공급자를 만든 후 모듈의 PreInitialize 메서드에 등록해야 합니다.

```csharp
Configuration.Authorization.Providers.Add<MyAuthorizationProvider>();
```

권한 부여 공급자는 종속성 주입([dependency injection](https://github.com/axuslab/docs.axs/blob/main/Developments/Dependency_Injection/README.md))에 자동으로 등록됩니다. 권한 부여 공급자는 다른 소스를 사용하여 권한 정의를 빌드하기 위해 모든 종속성 (예 : 저장소)을 삽입 할 수 있습니다.

#### 권한 체크

**AxsAuthorize 어트리뷰트를 사용한 권한 체크**

**AxsAuthorize** 속성은 권한을 확인하는 가장 쉽고 일반적인 방법입니다.

```csharp
[AxsAuthorize("관리자.사용자관리.추가")]
public void CreateUser(CreateUserDto input)
{
    // "관리자.사용자관리.추가" 권한이 허용된 사용자만 실행이 가능합니다.
}
```

"*관리자.사용자관리.추가*"권한이 부여되지 않은 사용자는 CreateUser 메서드를 호출 할 수 없습니다.

AxsAuthorize 속성은 현재 사용자가 로그인 했는지도 확인합니다 (using [IAxsSession.UserId](https://github.com/axuslab/docs.axs/blob/main/Developments/Session/README.md)). 메서드에 대해 AxsAuthorize를 선언하면 로그인만 확인합니다.

```csharp
[AxsAuthorize]
public void SomeMethod(SomeMethodDto input)
{
    // 로그인된 사용자가 실행할 수 있습니다.
}
```

**IPermissionChecker 사용**

AxsAuthorize 속성은 대부분의 경우에 충분하지만 메서드 본문에서 권한을 확인해야하는 상황이 있습니다. 아래 예제와 같이 **IPermissionChecker**를 주입하고 사용할 수 있습니다.

```csharp
public void CreateUser(CreateOrUpdateUserDto input)
{
    if (!PermissionChecker.IsGranted("관리자.사용자관리.추가"))
    {
        throw new AxsAuthorizationException("create user 권한이 없습니다.");
    }
}
```

**IsGranted**는 단순히 true 또는 false를 반환하므로 모든 논리를 코딩 할 수 있습니다. 위와 같이 단순히 권한을 확인하고 예외를 throw하면 **Authorize** 메서드를 사용할 수 있습니다 :

```csharp
public void CreateUser(CreateOrUpdateUserDto input)
{
    PermissionChecker.Authorize("관리자.사용자관리.추가");
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.axuslab.com/3.-application-layer/authorization.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
