« U-Bahn | Main | Tools on *nix »
Mann mann mann - choose your filter carefully: Ich brauche einige Versuche und kostbare Zeit um die GWT-SpringSecurity-Verknüpfung hinzukriegen - nun gehts:
Das hier verlangt für den allgemeinen Zugriff "/" (also auch die Anmeldungsseite!) einen anonymen User, sonst einen angemeldeten User und für "/mbopac/admin" eben einen Admin:
<http access-denied-page="/access-denied.html">
<intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY"
/>
<intercept-url pattern="/mbopac/admin/**" access="ROLE_ADMIN" />
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page="/login.html"
default-target-url="/Mbopac.html"
always-use-default-target='true' />
</http>
Das o.g. Tutorial ist ganz nett weil es Spring Security und GWT vereint, aber es läuft nicht auf der AppEngine: Das Problem ist die Spring autogenerierte Login-Seite, eine einfache eigene Seite "login.html" und Konfiguration in applicationContext.xml hilft dann endlich:
<html>
<head>
<meta http-equiv="content-type" content="text/html;
charset=UTF-8">
<link type="text/css" rel="stylesheet" href="Mbopac.css">
<title>OPAC Medienboten Bücherhallen Hamburg</title>
</head>
<body>
<h2>Bitte melden Sie sich an.</h2><br>
<form method="POST" action="j_spring_security_check">
Benutzer: <input type="text" name="j_username"><br>
Passwort: <input type="password" name="j_password"><br>
<input type='checkbox' name='_spring_security_remember_me'/> Auf
diesem Computer eingeloggt bleiben?.<br>
<input type="submit" value="Anmelden >>">
</form>
</body>
</html>
Mit diesem Tipp und einer Ableitungsebene mehr ist dann auch Springkonfiguration mit autowire erhältlich:
public class SpringGwtServlet extends RemoteServiceServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
WebApplicationContextUtils.
getRequiredWebApplicationContext(getServletContext()).
getAutowireCapableBeanFactory().
autowireBean(this);
}
}
Das hier (Double brace initialization) mag ja nett aussehen ist aber too "cute":
final Set<String> rolesAdmin = new HashSet<String>() {
{
add(CustomAuthenticationProvider.ROLE_USER);
add(CustomAuthenticationProvider.ROLE_ADMIN);
}
};
Es ist hat eben die Implementierungsdetails, dass das erste Klammerpaar eine anonyme Innerclass erzeugt und das zweite Paar einen static initializer deklariert: Somit ist die Klasse unbekannt wird im Serialisierungskosmos von GWT hiermit quittiert:
[ERROR] javax.servlet.ServletContext log: Exception while
dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type
'de.tixus.mb.opac.server.DataImporter$1' was not included in the set of
types which can be serialized by this SerializationPolicy or its Class
object could not be loaded. For security purposes, this type will not be
serialized.: instance = [ROLE_ADMIN, ROLE_USER]