JavaTM Platform
Standard Ed. 6

java.security
클래스 AccessController

java.lang.Object 
  상위를 확장 java.security.AccessController


public final class AccessController
extends Object

AccessController 클래스는, 액세스 제어의 조작과 결정에 사용됩니다.

구체적으로는, AccessController 클래스를 다음의 3 개의 목적으로 사용합니다.

checkPermission 메소드는, 지정한 액세스권에 의해 나타나는 액세스 요구가 허가되는지, 거부될까를 결정합니다. 호출의 예를 다음에 나타냅니다. 이 예에서는,checkPermission 는, /temp 디렉토리의 testFile 라고 하는 파일에의 읽어들여 권을 허가할지 어떨지를 결정합니다.

 
    FilePermission perm = new FilePermission("/temp/testFile", "read");
    AccessController.checkPermission(perm);
 
 

요구된 액세스가 허가되는 경우에는,checkPermission 는 아무것도 하지 않고 복귀합니다. 액세스가 거부되는 경우에는, AccessControlException 가 throw 됩니다. AccessControlException 는, 요구된 액세스권이 부정한 형태이거나 무효인 값을 포함해 있거나 했을 경우에도 throw 될 가능성이 있습니다. 가능한 경우에는, 그러한 정보가 제공됩니다. 현재의 thread가 호출해 원 1 으로부터 숫자의 승순으로 m 개의 호출원을 횡단(traverse) 해, 호출원 m 가 checkPermission 메소드를 호출한다고 합니다. 이 때,checkPermission 메소드는 다음의 알고리즘에 근거해, 액세스가 허가될까 거부될까를 결정합니다.

 i = m;
 
 while (i > 0) {
 
      if (호출측의 도메인에 액세스권이 없다)
              throw AccessControlException
 
      else if (호출원 i 가 특권 코드로서 마크 되고 있다) {
              if (문맥이 doPrivileged 의 호출로 지정되었다)  
                 context.checkPermission(permission)
              return;
      }
      i = i - 1;
 };

     // 그리고, thread가 작성되었을 때에 상속되었다
     // 문맥을 체크합니다. 새로운 thread가
     // 작성되었을 때는 항상, 「상속되었다」문맥으로서
     // 그 시점의 AccessControlContext 가 포함되어
     // 새로운 thread와 관련지을 수 있습니다.
 
 inheritedContext.checkPermission(permission);
 

호출측은, 특권 코드로서 마크 할 수 있습니다 (doPrivileged 및 이하의 설명을 참조). 액세스 제어를 결정하는 경우,checkPermission 메소드는, 문맥 인수가 없는 doPrivileged 의 호출에 의해 특권 코드로서 마크 된 호출 측에 닿았을 때에, 검사를 중지합니다 (문맥 인수에 대해서는, 이하의 설명을 참조). 그 호출원의 도메인이 지정된 액세스권을 가지고 있는 경우는,checkPermission 는 그 이상의 체크를 실시하지 않고 정상 복귀해, 요구된 액세스가 허가되고 있는 것을 나타냅니다. 그 도메인이 지정된 액세스권을 가지지 않는 경우는, 일반적으로은 예외가 발행됩니다.

다음에, 특권 기능의 일반적으로의 사용법을 설명합니다. 특권 블록내로부터 값을 돌려줄 필요가 없는 경우에는, 다음과 같이 기술합니다.

   somemethod() {
      ...normal code here...
      AccessController.doPrivileged(new PrivilegedAction() {
          public Object run() {
              // privileged code goes here, for example:
              System.loadLibrary("awt");
              return null; // nothing to return
          }
      });
     ...normal code here...
  }
 

PrivilegedAction 는, Object 를 돌려주는 run 라고 하는 메소드를 가지는 인터페이스입니다. 상기의 예는, 그 인터페이스의 구현의 작성 방법을 나타내고 있습니다. 즉,run 메소드의 구상 구현이 제공됩니다. doPrivileged 에의 호출해 때에, PrivilegedAction 의 구현의 인스턴스가 건네받습니다. doPrivileged 메소드는, 특권을 유효하게 한 후에, PrivilegedAction 의 구현으로부터 run 메소드를 호출해,run 메소드의 반환값을 doPrivileged 의 반환값으로서 돌려줍니다. 위의 예에서는 반환값은 무시되고 있습니다.

다음은, 값을 돌려줄 필요가 있는 경우의 예입니다.

   somemethod() {
      ...normal code here...
      String user = (String) AccessController.doPrivileged(
        new PrivilegedAction() {
          public Object run() {
              return System.getProperty("user.name");
          }
        }
      );
      ...normal code here...
   }
 

run 메소드로 실행한 액션이 「확인제」예외 (메소드의 throws 절에 표시되고 있는 예외)를 throw 할 가능성이 있는 경우에는,PrivilegedAction 인터페이스 대신에 PrivilegedExceptionAction 인터페이스를 사용할 필요가 있습니다.

   somemethod() throws FileNotFoundException {
        ...normal code here...
      try {
        FileInputStream fis = (FileInputStream) AccessController.doPrivileged(
          new PrivilegedExceptionAction() {
            public Object run() throws FileNotFoundException {
                return new FileInputStream("someFile");
            }
          }
        );
      } catch (PrivilegedActionException e) {
        // e.getException() should be an instance of FileNotFoundException,
        // as only "checked" exceptions will be "wrapped" in a
        // PrivilegedActionException.
        throw (FileNotFoundException) e.getException();
      }
        ...normal code here...
   }
 

특권 구조의 사용에는 세심의 주위를 기울여, 특권 코드 섹션을 가능한 한 작게 해 주세요.

checkPermission 는, 항상 현재 실행하고 있는 thread의 문맥내에서 시큐리티 체크를 실시합니다. 그러나 실제로는, 지정된 문맥내에서 실시하는 시큐리티 체크를, 「다른」문맥내로부터 (예를 들어, 워크스 레드내로부터) 실시하지 않으면 안 되는 경우도 있습니다. 이 상황에 대응하기 위해서,getContext 메소드와 AccessControlContext 클래스가 제공되고 있습니다. getContext 메소드는, 현재의 호출 문맥을 AccessControlContext 객체에 포함해 돌려줍니다. 호출의 예를 다음에 나타냅니다.

 
   AccessControlContext acc = AccessController.getContext()
 
 

AccessControlContext 자체가 checkPermission 메소드를 가지고 있어 이 메소드를 사용해, 현재의 실행 thread의 문맥은 아니고 캡슐화하고 있는 문맥에 근거해 액세스의 판단을 실시합니다. 따라서, 다른 문맥내의 코드는, 이전에 보존한 AccessControlContext 객체를 호출할 수가 있습니다. 호출의 예를 다음에 나타냅니다.

 
   acc.checkPermission(permission)
 
 

또, 문맥을 어느 액세스권으로 검사할지가, 사전에는 불명한 경우가 있습니다. 이러한 경우에는, 문맥을 값으로 해서 받는 doPrivileged 메소드를 사용할 수 있습니다.

   somemethod() {
         AccessController.doPrivileged(new PrivilegedAction() {
              public Object run() {
                 // 여기에 코드가 기술됩니다. 이 run 메소드내의
                 // 액세스권의 체크에서는, 호출측의 보호 도메인과
                 // snapshot의 문맥에 필요한
                 // 액세스권이 있을 필요가 있습니다.
              }
         }, acc);
         ...normal code here...
   }
 

관련 항목:
AccessControlContext

메소드의 개요
static void checkPermission (Permission  perm)
          현재의 AccessControlContext 와 시큐리티 정책에 근거해, 지정된 액세스권에 의해 나타나는 액세스 요구가 허가될까 거부될까를 결정합니다.
static
<T> T
doPrivileged (PrivilegedAction <T> action)
          유효하게 된 특권을 사용해, 지정된 PrivilegedAction 를 실행합니다.
static
<T> T
doPrivileged (PrivilegedAction <T> action, AccessControlContext  context)
          지정된 AccessControlContext 에 의해 유효하게 되어, 한편 제한되는 특권을 사용해, 지정된 PrivilegedAction 를 실행합니다.
static
<T> T
doPrivileged (PrivilegedExceptionAction <T> action)
          유효하게 된 특권을 사용해, 지정된 PrivilegedExceptionAction 를 실행합니다.
static
<T> T
doPrivileged (PrivilegedExceptionAction <T> action, AccessControlContext  context)
          지정된 AccessControlContext 에 의해 유효하게 되어, 한편 제한되는 특권을 사용해, 지정된 PrivilegedExceptionAction 를 실행합니다.
static
<T> T
doPrivilegedWithCombiner (PrivilegedAction <T> action)
          유효하게 된 특권을 사용해, 지정된 PrivilegedAction 를 실행합니다.
static
<T> T
doPrivilegedWithCombiner (PrivilegedExceptionAction <T> action)
          유효하게 된 특권을 사용해, 지정된 PrivilegedExceptionAction 를 실행합니다.
static AccessControlContext getContext ()
          현재의 thread의 상속된 AccessControlContext 를 포함한, 현재의 호출측 문맥의 「snapshot」를 취득해, AccessControlContext 객체에 배치합니다.
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
 

메소드의 상세

doPrivileged

public static <T> T doPrivileged(PrivilegedAction <T> action)
유효하게 된 특권을 사용해, 지정된 PrivilegedAction 를 실행합니다. 액션은, 호출측의 보호 영역에서 소유하고 있는 「모든」액세스권을 사용해 실행됩니다.

액션의 run 메소드가 미확인의 예외를 throw 하면(자), 예외는 이 메소드를 사용해 보내집니다.

액션의 실행중, 현재의 AccessControlContext 에 관련지을 수 있고 있는 DomainCombiner 는 무시됩니다.

파라미터:
action - 실행되는 액션
반환값:
액션의 run 메소드에 의해 반환되는 값
예외:
NullPointerException - 액션이 null 의 경우
관련 항목:
doPrivileged(PrivilegedAction, AccessControlContext) , doPrivileged(PrivilegedExceptionAction) , doPrivilegedWithCombiner(PrivilegedAction) , DomainCombiner

doPrivilegedWithCombiner

public static <T> T doPrivilegedWithCombiner(PrivilegedAction <T> action)
유효하게 된 특권을 사용해, 지정된 PrivilegedAction 를 실행합니다. 액션은, 호출측의 보호 영역에서 소유하고 있는 「모든」액세스권을 사용해 실행됩니다.

액션의 run 메소드가 미확인의 예외를 throw 하면(자), 예외는 이 메소드를 사용해 보내집니다.

이 메소드는, 액션의 실행중, 현재의 AccessControlContext 의 DomainCombiner (null 의 경우도 있다)를 보존합니다.

파라미터:
action - 실행되는 액션
반환값:
액션의 run 메소드에 의해 반환되는 값
예외:
NullPointerException - 액션이 null 의 경우
도입된 버젼:
1.6
관련 항목:
doPrivileged(PrivilegedAction) , DomainCombiner

doPrivileged

public static <T> T doPrivileged(PrivilegedAction <T> action,
                                 AccessControlContext  context)
지정된 AccessControlContext 에 의해 유효하게 되어, 한편 제한되는 특권을 사용해, 지정된 PrivilegedAction 를 실행합니다. 액션은, 호출측의 보호 영역에서 소유하고 있는 액세스권과 지정된 AccessControlContext 에 의해 나타내지는 영역에서 소유하고 있는 액세스권의 공통 부분을 사용해 실행됩니다.  

액션의 run 메소드가 미확인의 예외를 throw 하면(자), 예외는 이 메소드를 사용해 보내집니다.

파라미터:
action - 실행되는 액션
context - 지정된 액션의 실행전에 호출해 옆의 도메인의 특권에 적용되는 제한을 나타내는, 「액세스 제어 문맥」. 문맥이 null 의 경우, 추가의 제한은 적용되지 않는다
반환값:
액션의 run 메소드에 의해 반환되는 값
예외:
NullPointerException - 액션이 null 의 경우
관련 항목:
doPrivileged(PrivilegedAction) , doPrivileged(PrivilegedExceptionAction, AccessControlContext)

doPrivileged

public static <T> T doPrivileged(PrivilegedExceptionAction <T> action)
                      throws PrivilegedActionException 
유효하게 된 특권을 사용해, 지정된 PrivilegedExceptionAction 를 실행합니다. 액션은, 호출측의 보호 영역에서 소유하고 있는 「모든」액세스권을 사용해 실행됩니다.

액션의 run 메소드가 「미확인」의 예외를 throw 하면(자), 예외는 이 메소드를 사용해 보내집니다.

액션의 실행중, 현재의 AccessControlContext 에 관련지을 수 있고 있는 DomainCombiner 는 무시됩니다.

파라미터:
action - 실행되는 액션
반환값:
액션의 run 메소드에 의해 반환되는 값
예외:
PrivilegedActionException - 지정된 액션의 run 메소드가 「확인제」의 예외를 throw 했을 경우
NullPointerException - 액션이 null 의 경우
관련 항목:
doPrivileged(PrivilegedAction) , doPrivileged(PrivilegedExceptionAction, AccessControlContext) , doPrivilegedWithCombiner(PrivilegedExceptionAction) , DomainCombiner

doPrivilegedWithCombiner

public static <T> T doPrivilegedWithCombiner(PrivilegedExceptionAction <T> action)
                                  throws PrivilegedActionException 
유효하게 된 특권을 사용해, 지정된 PrivilegedExceptionAction 를 실행합니다. 액션은, 호출측의 보호 영역에서 소유하고 있는 「모든」액세스권을 사용해 실행됩니다.

액션의 run 메소드가 「미확인」의 예외를 throw 하면(자), 예외는 이 메소드를 사용해 보내집니다.

이 메소드는, 액션의 실행중, 현재의 AccessControlContext 의 DomainCombiner (null 의 경우도 있다)를 보존합니다.

파라미터:
action - 실행되는 액션
반환값:
액션의 run 메소드에 의해 반환되는 값
예외:
PrivilegedActionException - 지정된 액션의 run 메소드가 「확인제」의 예외를 throw 했을 경우
NullPointerException - 액션이 null 의 경우
도입된 버젼:
1.6
관련 항목:
doPrivileged(PrivilegedAction) , doPrivileged(PrivilegedExceptionAction, AccessControlContext) , DomainCombiner

doPrivileged

public static <T> T doPrivileged(PrivilegedExceptionAction <T> action,
                                 AccessControlContext  context)
                      throws PrivilegedActionException 
지정된 AccessControlContext 에 의해 유효하게 되어, 한편 제한되는 특권을 사용해, 지정된 PrivilegedExceptionAction 를 실행합니다. 액션은, 호출측의 보호 영역에서 소유하고 있는 액세스권과 지정된 AccessControlContext 에 의해 나타내지는 영역에서 소유하고 있는 액세스권의 공통 부분을 사용해 실행됩니다.  

액션의 run 메소드가 「미확인」의 예외를 throw 하면(자), 예외는 이 메소드를 사용해 보내집니다.

파라미터:
action - 실행되는 액션
context - 지정된 액션의 실행전에 호출해 옆의 도메인의 특권에 적용되는 제한을 나타내는, 「액세스 제어 문맥」. 문맥이 null 의 경우, 추가의 제한은 적용되지 않는다
반환값:
액션의 run 메소드에 의해 반환되는 값
예외:
PrivilegedActionException - 지정된 액션의 run 메소드가 「확인제」의 예외를 throw 했을 경우
NullPointerException - 액션이 null 의 경우
관련 항목:
doPrivileged(PrivilegedAction) , doPrivileged(PrivilegedExceptionAction, AccessControlContext)

getContext

public static AccessControlContext  getContext()
현재의 thread의 상속된 AccessControlContext 를 포함한, 현재의 호출측 문맥의 「snapshot」를 취득해, AccessControlContext 객체에 배치합니다. 이 문맥은, 나중에 다른 thread등으로 검사되는 경우가 있습니다.

반환값:
현재의 문맥에 근거하는 AccessControlContext
관련 항목:
AccessControlContext

checkPermission

public static void checkPermission(Permission  perm)
                            throws AccessControlException 
현재의 AccessControlContext 와 시큐리티 정책에 근거해, 지정된 액세스권에 의해 나타나는 액세스 요구가 허가될까 거부될까를 결정합니다. 이 메소드는, 액세스 요구가 허가되는 경우에는 아무것도 하지 않고 복귀해, 그렇지 않은 경우에는 적절한 AccessControlException 를 throw 합니다.

파라미터:
perm - 요구 액세스권
예외:
AccessControlException - 현재의 시큐리티 정책에 근거해, 지정된 액세스권이 허가되지 않는 경우
NullPointerException - 지정된 액세스권이 null 이며, 그 액세스권이 현재 유효한 시큐리티 정책에 근거해 체크되었을 경우

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.