어노테이션을 사용하여 소스 코드에서 직접
Java™ EE 엔터프라이즈
애플리케이션에 대한 보안을 제공할 수 있습니다.
이 태스크 정보
공통 보안 어노테이션: JSR 250에서는 다수의 공통 보안
어노테이션을 정의합니다. 다섯 개의 보안 어노테이션이 정의됩니다.
프로시저
- javax.annotation.security.PermitAll:
- 유형 또는 메소드 레벨에서 사용할 수 있습니다.
- 지정된 메소드 또는 지정된 EJB의 모든 비즈니스 메소드에 모든 사용자가
액세스할 수 있음을 표시합니다.
- javax.annotation.security.DenyAll:
- 메소드 레벨에서 사용할 수 있습니다.
- EJB의 지정된 메소드에 아무도 액세스할 수 없음을 표시합니다.
- javax.annotation.security.RolesAllowed:
- 유형 또는 메소드 레벨에서 사용할 수 있습니다.
- 지정된 메소드 또는 EJB의 모든 비즈니스 메소드에 역할 목록과 연관된
사용자가 액세스할 수 있음을 표시합니다.
- javax.annotation.security.DeclareRoles:
- 유형 레벨에서 사용할 수 있습니다.
- 보안 검사를 위한 역할을 정의합니다. EJBContext.isCallerInRole,
HttpServletRequest.isUserInRole 및 WebServiceContext.isUserInRole에 의해 사용됩니다.
- javax.annotation.security.RunAs:
- 유형 레벨에서 사용할 수 있습니다.
- 지정된 컴포넌트에 대한 실행 도구 역할을 지정합니다.
예
보안 어노테이션 사용
- @PermitAll, @DenyAll 및 @RolesAllowed 어노테이션의 경우 클래스 레벨
어노테이션이 클래스에 적용되고 메소드 레벨 어노테이션이 메소드에 적용됩니다.
메소드 레벨 어노테이션은 클래스 레벨 어노테이션의 동작을 대체합니다.
@Stateless
@RolesAllowed("team")
public class TestEJB implements Test {
@PermitAll
public String hello(String msg) {
return "Hello, " + msg;
}
public String goodbye(String msg) {
return "Goodbye, " + msg;
}
}
이 예제에서 hello() 메소드에는 모든 사용자가 액세스할 수
있으며 goodbye() 메소드에는 역할 팀의 사용자가 액세스할 수 있습니다.
- @DeclareRoles 어노테이션은 지정된 컴포넌트에서 사용되는 역할 목록을
정의합니다. Java EE 5 환경에서는
@javax.annotation.Resource를 사용하여 자원을 찾고 다음 API를 호출하여 사용자가 지정된 역할을 가지고 있는지를
확인합니다.
표 1. | 컴포넌트 |
역할을 확인하는 데 사용되는 API |
| EJB |
javax.ejb.EJBContext.isCallerInRole(role) |
| 서블릿 |
javax.servlet.http.HttpServletRequest.isUserInRole(role) |
| 웹 서비스 |
javax.xml.ws.WebServiceContext.isUserInRole(role) |
- @PermitAll, @DenyAll 및 @RolesAllowed 어노테이션을 사용하면 대부분의
권한 부여 결정을 구현할 수 있습니다. 그러나 더 복잡한 로직을 달성하려면
@DeclareRoles 어노테이션을 사용하십시오. 예를 들어, hello 메소드에 역할 A에
있으며 동시에 역할 B에는 있지 않은 사용자가 액세스할 수 있다고 가정하십시오.
다음 코드 클립을 통해 이러한 목표를 달성합니다.
@Stateless
@DeclaresRoles({"A", "B"})
public class TestEJB implements Test {
@Resource private SessionContext sc;
public String hello(String msg) {
if (sc.isCallerInRole("A") && !sc.isCallerInRole("B")) {
...
} else {
...
}
}
}
보안 어노테이션의 올바르지 않은 사용