Das Spring Framework ist eine Sammlung von Java-Klassen und Methoden zur Unterstützung von Applications. Hier sind einige Lösungen aufgezeigt.

Application Context#

Spring verwendet eine XML-Datei um einen Application Context zu konfigurieren. Dieser kann weitere Application Contexts einbinden, sodass eine Hierarchie entstehen kann.

System Properties#

Im Application Context können Bean-Werte durch System-Properties definiert werden:
    <bean id="testBean" class="com.intersult.test.TestBean">
    	<property name="testProperty" value="some-value"/>
    </bean>

Im Tomcat werden die catalina.properties zwar auch als System Properties geladen, allerdings anschließend durch den Web Application Class Loader überschrieben. Möchte man sie im Application Context zugreifbar machen, braucht man folgenden Eintrag:

    <context:property-placeholder system-properties-mode="OVERRIDE"/>

Login Filter#

Spring Security bietet sehr umfangreiche Konfigurationsmöglichkeiten, ebenso groß kann die Zeit werden, Verständnis für das Framework zu entwickeln. Bei kleinen Aufgaben kann es so hilfreich sein, Musterlösungen zu haben. Wie zum Beispiel für einen eigenen Single-Sign-On, Remember-Me oder anderen automatisierten Login:
	<sec:http auto-config="true">
		<sec:anonymous enabled="false"/>
		<sec:intercept-url pattern="/faces/page/**" access="ROLE_TEMPORARY"/>
		<sec:form-login login-page="/login"/>
		<sec:custom-filter ref="temporaryLoginFilter" before="FILTER_SECURITY_INTERCEPTOR"/>
		<sec:logout logout-success-url="/faces/security/login.xhtml"/>
	</sec:http>
@Component
public class TemporaryLoginFilter extends GenericFilterBean {
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
			ServletException {
		if (...)
		    throw new AuthenticationCredentialsNotFoundException("Authentication required");
		if (...)
		    SecurityContextHolder.getContext().setAuthentication(authentication);
		chain.doFilter(request, response);
	}
}

Erklärung: Der Kunstgriff besteht darin, einen Custom-Filter vor dem FilterSecurityInterceptor in die Filter-Chain einzuhängen. Der Grund besteht darin, dass an dieser Stelle Security-Exceptions vom ExceptionTranslationFilter gefangen werden und in einem Redirect auf die Login-Seite resultieren bzw. je nachdem, welchen Login-Mechanismus man standardmäßig konfiguriert hat. Andernfalls kann man den Benutzer durch setzen des Security-Context programmatisch einloggen.