본 장에서는 보안 시스템 API 프로그래밍에 대해 설명한다.
사용자 애플리케이션에 자신만의 특별한 보안 기능을 추가하기 위해 보안 시스템 API를 사용하여 프로그래밍할 수 있다. 이러한 예로는 애플리케이션을 통해 등록한 사용자를 자동으로 JEUS 보안 시스템에 등록하는 Registration Servlet("auto-registration"이라고 한다)이 있다.
애플리케이션 프로그래머는 보안 서비스를 개발하기 전에 표준 J2EE 보안 모델과 JEUS의 보안 서비스들이 원하는 보안 기능을 제공하는지 먼저 확인한다. 보안 API를 사용하여 프로그램을 개발하게 되면 J2EE 서버 간의 호환성이 떨어진다. 일반적으로 J2EE 서버 간의 호환성을 유지하기 위해 표준 J2EE 보안 인터페이스만 사용하기를 권장한다.
악의적인 사용자 코드(서블릿, EJB)로부터 JEUS 시스템을 보호하기 위해 보안 API를 사용할 수 있다.
사용자 코드에 보안 API를 사용하는 경우는 Java SE SecurityManager를 사용하거나 소스 코드(서블릿, EJB)가 SecurityCommonService.loginDefault(Subject)를 사용하여 성공적으로 로그인한 경우이다. 이때 Subject는 Target 보안 도메인의 accounts.xml에 미리 설정되어 있는 사용자에 대한 Subject로 policies.xml에 설정된 필요한 JEUS Permission을 가지고 있는 경우이다.
각 파일에 대한 설정 방법은 다음을 참고한다.
Java SE SecurityManager와 Java SE Policy 파일 : “2.7.1. Java SE SecurityManager 설정”
accounts.xml : “2.5. 보안 시스템 사용자 정보 설정”
JEUS 보안 시스템에 policies.xml : “2.6. 보안 시스템 정책 설정”과 참고 자료
애플리케이션 프로그래밍 레벨에서 보안 시스템과 연동할 때 jeus.security.base 패키지의 클래스는 중요한 역할을 한다.
리소스와 관련해서 jeus.security.base 패키지의 몇 가지 기본 클래스뿐만 아니라 jeus.security.resource 패키지의 클래스도 중요한 역할을 한다.
해당 클래스에 대한 자세한 정보는 Javadoc과 참고 자료를 확인한다.
보안 시스템의 근간을 이루는 서비스와 작업하려면, jeus.security.spi 패키지의 SPI 클래스를 사용해야 한다.
해당 클래스에 대한 자세한 정보는 Javadoc과 참고 자료를 확인한다. SPI 클래스에 대한 더욱 상세한 정보는 “제5장 Custom 보안 서비스 개발”을 참고한다.
다음 예제는 보안 API를 사용한 프로그램의 일부이다.
// Login the CodeSubject so that security checks are // disabled (so that we can modify the Subject and Policy // stores) SecurityCommonService.loginCodeSubject(); // Make Subject with Principal “pete” Principal petePrincipal = new PrincipalImpl(“pete”); Subject pete = new Subject(petePrincipal); // Make password “petepw” for Subject “pete” PasswordFactory pf = new PasswordFactory(“petepw”); pete.getCredentialFactories().add(pf); // Add new Subject to the Subject store AuthenticationRepositoryService.addSubject(pete); // Make a new Policy Policy policy = new Policy(); // Make role “someRole” Role someRole = new RoleImpl(“someRole”); // Make a RolePermission for role “someRole” Permission rolePermission = new RolePermission(someRole); // Add the RolePermission for “someRole” to the Policy policy.getRolePolicy().addPermission( rolePermission, new Object[] {petePrincipal}, false, false); // Create a ResourcePermission for resource “rsc1” with actions // “action1” and “action2” Permission rscPermission = new ResourcePermission(“rsc1”, “action1,action2”); // Add the ResourcePermission to the Policy using // context id “ctx1” policy.getResourcePolicy(“ctx1”, true).addPermission( rscPermission, new Object[] {someRole}, false, false); // Add the new Policy to the Policy store AuthorizationRepositoryService.addPolicy(policy); // Logout the CodeSubject so that security checks are // enabled again SecurityCommonService.logout(); // Make a Subject to be logged in Subject pete2 = Subject.makeSubject(“pete”, “petepw”); // Login Subject “pete” (should succeed since we added // “pete” earlier) SecurityCommonService.loginDefault(pete2); // Check ResourcePermission “rsc1” for current Subject (“pete”) // Should succeed since we added Policy for this above SecurityCommonService.checkPermission( “ctx1”, new ResourcePermissin(“rsc1”, “action2”); // Print the name of the current Subject (“pete”) System.out.println( SecurityCommonService.getCurrentSubject().getPrincipal().getName()); // Logout “pete” SecurityCommonService.logout();