10.2. 설정

Acegi Security에서 제공되는 RunAsManager 인터페이스는 다음과 같다:

public Authentication buildRunAs(Authentication authentication, Object object, ConfigAttributeDefinition config);
public boolean supports(ConfigAttribute attribute);
public boolean supports(Class clazz);

첫 번째 메소드는 메소드 호출이 이루어지는 동안 기존 Authentication 객체를 대체할 Authentication 객체를 반환한다. 메소드가 null을 반환하면 아무런 대체도 이루어지지 않아야 함을 의미한다. 두 번째 메소드는 설정 속성에 대한 초기 유효성 검증의 일부로서 AbstractSecurityInterceptor에서 사용된다. supports(Class) 메소드는 보안 인터셉터 구현체에 의해 호출되어 설정된 RunAsManager가 보안 인터셉터가 제공할 안전 객체의 타입을 지원하는지를 확인해준다.

Acegi Security에는 하나의 RunAsManager에 대한 구상 구현체를 제공하고 있다. RunAsManagerImpl 클래스는 ConfigAttributeRUN_AS_로 시작할 경우 교환 RunAsUserToken을 반환한다. 만약 그러한 ConfigAttribute가 발견되면 교환 RunAsUserToken은 새로운 각각의 RUN_AS_ ConfigAttribute에 대한 새로운 GrantedAuthorityImpl 뿐만 아니라 동일한 인증주체와 신원정보, 허가된 권한들을 원래의 Authentication 객체로서 포함할 것이다. 각각의 새로운 GrantedAuthorityImpl은 ROLE_이라는 접두사를 가지며 RUN_AS_ ConfigAttribute가 따라 붙는다. 예를 들면 RUN_AS_SERVERROLE_RUN_AS_SERVER라는 허가 권한을 포함하는 대체 RunAsUserToken을 만들어낼 것이다.

대체 RunAsUserToken은 다른 Authentication 객체와 매우 유사하다. 교환 RunAsUserToken은 아마 적절한 AuthenticationProvider에 위임된 객체를 통해 AuthenticationManager에 의해 인증될 필요가 있다. RunAsImplAuthenticationProvider는 그러한 인증을 수행한다. RunAsImplAuthenticationProvider는 단순히 제시된 RunAsUserToken이 유효하다면 어떤 것이든 받아들인다.

악성코드가 RunAsUserToken를 생성하지 않으며 RunAsImplAuthenticationProvider에 보장된 상태로 받아들여지지 않도록 보장하기 위해서는 키의 해시가 생성된 모든 토큰에 저장되도록 한다. RunAsManagerImplRunAsImplAuthenticationProvider는 동일한 키를 가지고 빈 컨텍스트내에 생성된다:

<bean id="runAsManager" class="org.acegisecurity.runas.RunAsManagerImpl">
  <property name="key"><value>my_run_as_password</value></property>
</bean>

<bean id="runAsAuthenticationProvider" class="org.acegisecurity.runas.RunAsImplAuthenticationProvider">
  <property name="key"><value>my_run_as_password</value></property>
</bean>

        

동일한 키를 사용함으로써 각 RunAsUserToken들은 승인된 RunAsManagerImpl에 의해 생성되었는지에 대한 유효성 검사를 받을 수 있다. RunAsUserToken은 보안상의 이유로 생성된 후에는 변경되지 않는다.