Spring Security Host Based


#1

Guten Abend Community,

ich möchte einige Facelets Seiten nutzen, um für E-Mails HTML Content zu generieren und zu versenden. Dazu würde ich einfach JSF / Facelets Seiten erstellen, die ich dann von einem Spring Job aufrufen möchte (Apache HTTP Client) und den generierten Content per Mail versenden.

Nun möchte ich nicht, dass man diese Seiten von “außerhalb” des Servers aufrufen kann. Kann man dazu Spring Security irgendwie verwenden … sozusagen Host Based Security? Was gäbe es sonst für Alternativen?


#2

Ich kann das nicht auf Anhieb im Detail skizzieren aber das wäre möglich. Fragt sich nur, ob der Aufwand gerechtfertigt ist. Ich nehme an, dass Du Folgendes machen musst:
[ul]
[li]Du kannst AFAIK die Namespace-Konfiguration nicht nutzen sondern musst die FilterChain selbst aufbauen und modifizieren.
[/li][li]Du musst einen ExceptionTranslationFilter sub-classen, der eine 403 statt einen Redirect zum AuthenticationEntryPoint wirft:
[/li]```@Component
public class BypassExceptionTranslationFilter extends ExceptionTranslationFilter {

public BypassExceptionTranslationFilter() {
	super(new Http403ForbiddenEntryPoint());
}

}```
[li] Du solltest einen eigenen AbstractAuthenticationProcessingFilter subclassen, der z. B. einen “magischen” Header als Authentifizierung nimmt.
[/li][li] Du solltest darauf achten, dass der AuthenticationProcessingFilter keine Sessions erzeugt.
[/li][/ul]

Ich weiss ja nicht, aber kannst Du keine x-beliebige Template-Engine (Freemarker oder so) nehmen, Dein Model/Context injizieren und das auf dem Testsystem per Controller im Browser angucken? Auf der Produktion liest Du einfach den String aus, den Freemarker generiert.


#3

[QUOTE=kay73;67897]Ich weiss ja nicht, aber kannst Du keine x-beliebige Template-Engine (Freemarker oder so) nehmen, Dein Model/Context injizieren und das auf dem Testsystem per Controller im Browser angucken? Auf der Produktion liest Du einfach den String aus, den Freemarker generiert.[/QUOTE]

Ich habe hier schon XHTML Code den ich wiedervewenden möchte. Somit wäre es deutlich mehr Aufwand, wenn ich alles mit Freemarker nacharbeiten müsste.

Ich habe auch schon nach Code gesucht, der mir die Seiten im Job rendert. Allerdings scheint mir ein Aufruf über den Server einfacher. Nur, dass ich die irgendwie absichern muss. Gäbe es die Möglichkeit aus dem Job heraus sich anzumelden? Dann könnte ich die Seiten mit einem User absichern.


#4

Ich habe nun eine Variante ohne Spring erarbeitet:

@Scope(value = "prototype")
public class EmailBean implements Serializable {

	private static final long serialVersionUID = 7464925969629518166L;

	private transient Logger log = Logger.getLogger(this.getClass());

	@Autowired
	private HttpServletRequest request;

	@Autowired
	private FacesContext facesContext;
	
	private String [] possibleURLs = {"http://localhost:8080/", "https://localhost:8080/", "http://127.0.0.1:8080/", "https://127.0.0.1:8080/"};

	@PostConstruct
	public void init() {	
		try {
			if (!checkIfLocalURL()) {
				facesContext.getExternalContext().responseSendError(403, "Zugriff verweigert");
				facesContext.responseComplete();
			}
		} catch (IOException e) {
			log.error("Zugriff verweigert", e);
		}
		
//		Hier Daten aufbereiten		
	}
	
	private boolean checkIfLocalURL(){
		String requestURL = request.getRequestURL().toString().toLowerCase();
		for(String possibleURL : possibleURLs)
			if(requestURL.startsWith(possibleURL))
				return true;
		
		return false;
	}
}```

Somit sollte von keinem Rechner der Welt diese Seite aufgerufen werden können, außer vom Rechner selbst. Ich hoffe man kann beim Request den URL nicht fälschen. Zusätzlich werde ich noch einen Identifier als Parameter übergeben, über den dann die Daten aus der DB geladen werden. Den werde ich entsprechend lang wählen, sodass es kaum möglich sein sollte einen davon zu erraten.

Was meint ihr dazu?