3 Stimmen

Wie konfiguriere ich die Spring Security 2 Datenbankauthentifizierung mit Hibernate 3 Annotated Classes?

Ich baue eine Anwendung mit Hibernate 3 (mit JPA Annotations), Spring 2.5 und Spring Security 2.0.5.

Ich möchte wissen, was ich in meine Tasche stecken muss. <authentication-provider> Tag in meiner Spring Security-Konfigurationsdatei (applicationContext-security.xml), so dass ich Spring Security meine vorhandene Service-Schicht-Klasse (AuthenticationService) verwenden kann, die sich mit meinen benutzerdefinierten Benutzer- und Rollendomänenobjekten beschäftigt.

Ich weiß, dass Spring Security zwei Tabellen mit dem folgenden Schema erfordert:

     create table users(
      username varchar_ignorecase(50) not null primary key,
      password varchar_ignorecase(50) not null,
      enabled boolean not null);

  create table authorities (
      username varchar_ignorecase(50) not null,
      authority varchar_ignorecase(50) not null,
      constraint fk_authorities_users foreign key(username) references users(username));

  create unique index ix_auth_username on authorities (username,authority);;

aber ich möchte meine eigenen Domänenobjekte verwenden, die sich von den obigen Tabellendefinitionen unterscheiden.

Könnte mir bitte jemand den richtigen Weg weisen? Ich kann keine brauchbare Dokumentation finden und bin mir nicht sicher, ob das, was ich tun möchte, überhaupt möglich ist.

Danke!

8voto

axtavt Punkte 233070

Sie können eine benutzerdefinierte UserDetailsService als Brücke zwischen Ihrer Domäne und Spring Security. Dann versorgen Sie Spring Security damit wie folgt (für Spring Security 2.x):

<security:authentication-provider user-service-ref='myUserDetailsService'/>

<bean id="myUserDetailsService" class="... your implementation ...">
    ...
</bean>

1voto

Teja Kantamneni Punkte 17179

Definieren Sie Ihr individuelles AutenticationManager mit <bean id="myAuthenticationManager" class="com.security.MyAuthunticationManager"/> et le MyAutenticationManager Klasse sollte implementieren org.springframework.security.AuthenticationManager und überschreiben Sie die Methode authenticate(Authentication authentication) in dem Sie Ihre benutzerdefinierten Dienst- und Domänenobjekte verwenden werden, um die Anmeldeinformationen des Benutzers zu validieren und seine Rollen zum Authentifizierungsobjekt hinzuzufügen.

1voto

Droo Punkte 3097

Tun Sie, was axtavt sagte, oder wenn Sie nicht mehr brauchen, als eine benutzerdefinierte Tabelle zu treffen, können Sie die Abfrage überschreiben:

<security:authentication-provider>
     <jdbc-user-service data-source-ref="dataSource" 
        authorities-by-username-query="SELECT u.username, a.authority FROM users u, authorities a WHERE u.username = a.username AND u.username = ?" />
        users-by-username-query="SELECT username, password, enabled FROM users WHERE username = ?" />
</security:authentication-provider>

Ich würde allerdings tun, was axtavt vorschlägt. Sie können ein DTO (Data Transfer Object) erstellen, das das Spring Security User Objekt implementiert. Dies ermöglicht Ihnen den Zugriff auf relevante Daten, wenn Sie den Benutzer aus dem SecurityContextHolder abrufen:

Object o = SecurityContextHolder.getContext().getAuthentication().getDetails();
UserDetailsDTO u = (UserDetailsDTO) o;
User user = u.getUser();
// now you have primary key, etc., etc.

Wenn man sich Ihre Tabellen ansieht, brauchen Sie das im Moment wirklich nicht, aber IMO muss Ihr Schema überarbeitet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X