AccessController — 접근 제어 컨트롤러
AccessController — 접근 제어 컨트롤러
접근 제어 결정을 내리고 권한 있는(privileged) 코드를 실행하는 데 사용하는 정적 메서드들을 제공하는 클래스예요. doPrivileged는 지정한 동작을 권한을 활성화한 상태로 수행하고, checkPermission은 지정한 권한에 대한 접근을 허용할지 판단해요. 이 클래스는 직접 인스턴스화할 수 없어요.
본문
권한 있는 동작 실행 (doPrivileged)
public static <T> T doPrivileged(PrivilegedAction<T> action)— 지정한PrivilegedAction을 권한을 활성화한 상태로 수행해요. 동작은 호출 스택의 접근 제어 컨텍스트에 포함된 모든 권한으로 수행돼요.public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action)— 지정한PrivilegedAction을 권한을 활성화한 상태로 수행해요. 기존DomainCombiner가 있으면 재사용돼요.public static <T> T doPrivileged(PrivilegedAction<T> action, AccessControlContext context)— 지정한 동작을 권한을 활성화한 상태로, 주어진AccessControlContext로 제한해 수행해요.public static <T> T doPrivilegedWithCombiner(PrivilegedAction<T> action, AccessControlContext context)— 주어진 컨텍스트로 제한하고DomainCombiner를 재사용해 수행해요.public static <T> T doPrivileged(PrivilegedExceptionAction<T> action) throws PrivilegedActionException— checked 예외를 던질 수 있는PrivilegedExceptionAction을 권한을 활성화한 상태로 수행해요.
컨텍스트와 권한 검사
public static AccessControlContext getContext()— 현재 호출 컨텍스트의 "스냅샷"을AccessControlContext객체로 만들어 반환해요.public static void checkPermission(Permission perm) throws AccessControlException— 지정한 권한이 나타내는 접근 요청을 허용할지 거부할지, 실행 스레드의 현재 보안 정책과 컨텍스트에 따라 판단해요. 거부되면AccessControlException을 던져요.
try {{
FileInputStream fis = AccessController.doPrivileged(
new PrivilegedExceptionAction<FileInputStream>() {{
public FileInputStream run() throws FileNotFoundException {{
return new FileInputStream("someFile");
}}
}});
}} catch (PrivilegedActionException e) {{
throw (FileNotFoundException) e.getException();
}}
doPrivileged를 사용할 때는 권한 있는 코드 구간을 가능한 한 작게 유지하는 것이 중요해요.