Spring MVC REST + Spring Security mit Java Config einrichten

cyb03

Cadet 1st Year
Registriert
März 2014
Beiträge
10
Hi,

ich bin gerade dabei mich mit dem Spring Framework zu beschäftigen. Bisher habe ich Spring MVC aufgesetzt und verschiedene REST-Services erstellt alles mit java config. Als Datenbank verwende ich Postgres.

Mein Problem ist jetzt noch Spring Security einzurichten. Ich nutze keine JSP seiten sondern als Webfrontend AngularJS, was nur über die REST-Services auf mein Backend zugreift.

Ich wollte OAUTH2 verwenden, oder gibt es da auch eine einfachere Möglichkeit !?

Im Prinzip will ich mit Spring Security verschiedene Rollen einrichten am Anfang nur User und Admin und halt den eigentlichen Login mit Username und Passwort. Username/Passwort usw sollen in meiner Datenbank stehen, braucht man bei Spring Security eine spezielle Datenbank strutkur um Username/Passwort und rollen zu speichern !?

Ich will das ganze mit Java Config machen, aber mich übrefordert die ganze Sache im Moment etwas. Bisher habe ich nur zum testen einen einfachen form Login erstellt der sieht so aus..

erstmal die Security COnfig:

Code:
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	
	@Override
	public void configure(AuthenticationManagerBuilder auth) throws Exception {
		
		auth
		.inMemoryAuthentication()
		.withUser("user").password("test").roles("User");
	}
	

}

Die meisten beispiele sind nur so inMemoryAuthentication aber ich brauche username passwort in einer Datenbank

und zum initialisieren benutze ich einen Webinitializer:

Code:
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

	@Override
	protected Class<?>[] getRootConfigClasses() {
		return new Class<?>[]{ SecurityConfig.class }; 
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class<?>[] { WebConfig.class };
	}

	@Override
	protected String[] getServletMappings() {
		return new String[] { "/*" }; 
	}
	
	@Override
	protected Filter[] getServletFilters() {
		
		CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
		characterEncodingFilter.setEncoding("UTF-8");
	
		return new Filter[] {characterEncodingFilter};
	}
}


könnte mir da jemand helfen wie muss ich das ganze anpassen damit ich meine Rest Services absichern kann. Bei OAUTH2 wird ja dann auch ein Token generiert, ist in dem dann auch automatisch die Rollenzugehörigkeit gespeichert ? und wird der Token dann auf Serverseite nur im Cache gehalten ?

Wenn es Leute gibt die vll aus der nähe von Offenburg oder evtl noch Freiburg kommen und mit helfen könnten wäre das sehr nett, es soll auch nicht umsonst sein. Anfragen dazu bitte per PN.

Es muss auch nicht uznbedingt oauth2 sein ich will einfach nur nen Login mit Username/Passwort bei dem man sich nen Tokken oder sonstiges holt und diesen dann in nem cookie oder so speichert und halt ein kleines Rollen-Management. Wenn dann jemand einen Rest-Service von mir benutzen will soll er einfach den Tokken mitschicken und der Rset-Service soll dann prüfen ob derjenige berechtig ist.
Wenn es da mit Spring security was einfacheres als oauth2 gibt wäre das auch ok.

mfg cyb
 
Zuletzt bearbeitet:
Schema ist hier.

OAuth2 ist toll. Vielleicht nicht der leichteste Weg hier. Wenn du OAuth benutzt, dann schau dir das entsprechende Projekt und die Doku an.

Per OAuth kannst du theoretisch auch das scope-Attribut benutzen, um bestimmte Zugangsbereiche einzuschränken. Hab ich aber noch nicht benutzt, daher kann ich dir da im Detail nicht helfen. Mir hat bisher immer gereicht anhand der gesendeten client_id zu entscheiden, wer was darf und wer nicht.
Zur frage ob die tokens im cache gehalten werden - ich habe sie immer persistiert. Musst du wissen, ob dich dass stört, dass sie bei restart weg sind, falls dein cache nicht persistent ist.

Bist doch schon recht weit, viel fehlt nicht mehr. ;)
 
HI,

danke erstmal für deine Antwort

was heißt an der client_id ? welches verfahren verwendest du für den Login usw ?

Ich nutze kein JPA ,funktioniert es dann trotzfdem mit spring security ?

Ich will im prinzip nur das ich z.b eine LoginPage haben die jeder erreichen kann.. wenn er sich dann dort angemeldet hat, soll ein tokken erstellt werden den ich z.b in einem Cookie speichere und wenn dann einer auf meiner AnuglarJS seite einen REST-Service aufruft wird praktisch nur der tokken mitgeschickt und auf der Serverseite überprüft oder er gültig ist bzw die erforderlichen Rechte hat..
Wenn ich das ganze dann noch mit einem RollenManagement kombinieren könnte wäre das super.. Das ich z.b einfach über die Rest-Services auf der ServerSeite @Secured(RoleUser) schreiben kann und es überprüft ob die aktuell übertragene tokken id die jweiligen Rechte besitzt den Rest Service zu benutzen.. Ich brauche nicht unbedingt OAuth2 wenn es auch einfacher gehen würde und ich den oben beschriebenen Fall damit erfüllen kann.

mfg cyb
 
Zuletzt bearbeitet:
Wenn du dich eingeloggt hast, z.B. über so ein form login, dann hast du ja bereits eine session (siehe JSESSIONID cookie). Das reicht für das, was du vorhast. Musst ja nur in deinem REST-Controller so ungefähr überprüfen, ob eine session besteht. Weiß gerade nicht, ob Spring Security irgendwas wie "isLoggedIn/isValid" in die Session schreibt. Musst du mal ein bisschen forschen.

Bei OAuth hingegen ist es halt so, dass jeder, der einen access token erhalten will, sich erstmal authentifizieren muss. Dazu überträgt er mindestens mal client_id und client_secret (der Standard sieht 4 verschiedene Varianten vor, siehe 1.3). Wenn ich nun sehe, dass jemand mit einem access token bei meinem RESTful service ankommt, dann kann ich anhand des tokens den client bestimmen, der den access token initial mal angelegt hat (habe einfach eine one to many/many to one Beziehung zwischen access tokens und mir bekannten OAuth clients in der DB).

Ich habe mit Spring Security bisher auch mehr rumgespielt, als wirklich mal ein Projekt bis zum Schluss damit umgesetzt. Ich war ganz kurz davor genau sowas wie du zu machen in einem bestehenden Projekt wo AngularJS gegen Spring REST-Services funkt. Und es steht noch aus das zu tun! Leider kann ich dir daher kein fertiges Beispiel präsentieren. Mal sehen wann ich Zeit finde da weiter zu machen ;)
 
Hi,

naja ich hab ja keine session oder jsp Seiten mehr.. Angularjs ist ja statless, mein server Backend mit Spring MVC und angular sind völlig getrennt voneinander ich greife nur noch über die Rset-Services darauf zu..

Das Spring Security DB Schema ist aber auch mist, das nutzt ja den Usernamen als PK !? Wieso gibts da keine ID ?

Man Spring Security bringt mich noch ins Grab, irgendwie habe ich mir dsa leichter vorgestellt. Wenn es doch nocht einen gibt der in der nähe von Offenburg oder Freiburg wohnt wäre es sehr nett wenn sich einer melden würde, wie gesagt keiner muss es umsonst machen.

mfg cyb
Ergänzung ()

Hi,

wie sieht es denn mit dem Beispiel hier aus https://github.com/philipsorst/angular-rest-springsecurity

sowas wie er dort macht brauche ich, ich bin gerade dabei es bei mir mal testweise einzubauen bzw ich versuche es. Welches Auth Verfahren verwendet er denn dort ? Kann es sein dass das was custom mäßiges ist ? Ich dachte erst es ist Remember me.

So ganz verstehe ich sein vorgehen aber noch nicht.
Wie kann ich z.b das hier als java config abbilden:

Code:
	<security:http
realm="Protected API"
use-expressions="true"
auto-config="false"
create-session="stateless"
entry-point-ref="unauthorizedEntryPoint"
authentication-manager-ref="authenticationManager">
<security:custom-filter ref="authenticationTokenProcessingFilter" position="FORM_LOGIN_FILTER" />

Der Ausschnitt ist von hier: https://github.com/philipsorst/angu...ty/blob/master/src/main/resources/context.xml


und den UserDetailsService kann ich auch ohne JPA bzw DAOs einrichten oder ?

mfg cyb

EDIT2: ich kann z.b oben in meiner SecurityConfig folgendes hinzufügen:

Code:
 @Override
	public void configure(HttpSecurity http){
		
	http....
		
	}

dort gibt es auch ein http.rememberMe().. fragt sich ob es damit vll einfacher ist !?
aber wo ich realm, create-session, entrypoint usw dort einstelle habe ich nichts gefunden !?

EDIT3: Kann es sein dass er Digest AUthentication verwendet !?
 
Zuletzt bearbeitet:
Zurück
Oben