Security ist ein allgegenwärtiger Begriff bei der Entwicklung von Software. Dies gilt sowohl für Anwendungen für den privaten Gebrauch als auch für Unternehmensanwendungen. Dabei lässt sich der Begriff Security in unterschiedliche Bereiche unterteilen:
- Authentifizierung
- Sichere Kommunikation
- Datensicherheit
- Autorisation
Jeder dieser Aspekte muss im Rahmen einer Implementierung entsprechend den Anforderungen berücksichtigt werden. Für Authentifizierung und Autorisation bietet Eclipse RCP bereits Mechanismen, deren Verwendbarkeit in einer verteilten Umgebung jedoch überprüft werden muss.
Authentifizierung
Im Rahmen des Equinox-Security-Projekts bietet Eclipse RCP die Möglichkeit, für die Authentifizierung JAAS zu verwenden [2]. Somit kann hier die Standard-Java-Login-Infrastruktur zum Einsatz kommen, typischerweise erfolgt die Authentifizierung dann gegen ein LDAP-System. Im Kontext einer verteilten Anwendung ist allerdings zu bedenken, dass eine durch den Client gesteuerte Authentifizierung gegen ein Fremdsystem zwar grundsätzlich möglich ist, architekturbedingt jedoch die Kommunikation mit anderen Systemen immer zentral durch die Serverseite erfolgen sollte. Diese stellt dafür üblicherweise einen Dienst bereit, den der Client verwenden kann. Entsprechend des im vorherigen Teil vorgestellten Spring Remotings würde die Serverseite einen Service anbieten, der vom Client zur Authentifizierung genutzt wird.
public interface ISecurityService {String login(String userId, String password);}
Der Service liefert als Rückgabewert einen Token, der bei zukünftigen Requests mittels Piggybacking, also transparent im HTTP Request Header, vom Client mit übermittelt werden muss. Der Token kann auf beiden Seiten, Client- und Serverseite, aspektorientiert behandelt werden. Mit einem Aspekt um die vom Client verwendeten Remote-Services kann der Token auf der Serverseite überprüft werden. Der serverseitige Aspekt kann leicht über die Spring-Konfiguration deklariert werden.
<bean class="org.springframework.aop.framework.ProxyFactoryBean" id="fooRemoteService"><property name="proxyInterfaces" value="com.demo.IFooRemoteService"/><property name="target" ref="fooRemoteServiceTarget"/><property name="interceptorNames"><list><value>securityAdvice</value></list></property></bean><bean class="com.foo.SecurityAdvice" id="securityAdvice"><property name="contextProvider" ref="contextProvider"/></bean>
Der SecurityAdvice überprüft dabei den vom Client bereitgestellten Token, den er über die ContextProvider-Bean zur Verfügung gestellt bekommt.
public class SecurityAdvice implements MethodBeforeAdvice {private IContextProvider contextProvider;public void before(Method method, Object[] arguments, Object returnType) throws Throwable {ISessionService sessionService = (ISessionService) applicationContext.getBean("sessionService");if (!sessionService.isValid(contextProvider.getContextSessionId())) {throw new SessionInvalidException("Session <"contextProvider.getContextSessionId() + "> is invalid.");}}}
Ein HTTP-Filter hat die Informationen zuvor aus dem http-Request ausgelesen und dem ContextProvider über einen ThreadLocal zugänglich gemacht.




