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 클래스는 ConfigAttribute가
RUN_AS_로 시작할 경우 교환 RunAsUserToken을
반환한다. 만약 그러한 ConfigAttribute가 발견되면 교환
RunAsUserToken은 새로운 각각의
RUN_AS_ ConfigAttribute에 대한 새로운
GrantedAuthorityImpl 뿐만 아니라 동일한 인증주체와 신원정보,
허가된 권한들을 원래의 Authentication 객체로서 포함할 것이다.
각각의 새로운 GrantedAuthorityImpl은 ROLE_이라는 접두사를 가지며
RUN_AS_ ConfigAttribute가 따라 붙는다.
예를 들면 RUN_AS_SERVER는
ROLE_RUN_AS_SERVER라는 허가 권한을 포함하는 대체
RunAsUserToken을 만들어낼 것이다.
대체 RunAsUserToken은 다른 Authentication 객체와
매우 유사하다. 교환 RunAsUserToken은 아마 적절한 AuthenticationProvider에
위임된 객체를 통해 AuthenticationManager에 의해 인증될 필요가 있다.
RunAsImplAuthenticationProvider는 그러한 인증을 수행한다.
RunAsImplAuthenticationProvider는 단순히 제시된
RunAsUserToken이 유효하다면 어떤 것이든 받아들인다.
악성코드가 RunAsUserToken를 생성하지 않으며
RunAsImplAuthenticationProvider에 보장된 상태로 받아들여지지 않도록
보장하기 위해서는 키의 해시가 생성된 모든 토큰에 저장되도록 한다.
RunAsManagerImpl과
RunAsImplAuthenticationProvider는 동일한 키를 가지고
빈 컨텍스트내에 생성된다:
<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은 보안상의 이유로 생성된
후에는 변경되지 않는다.