2016-06-20 4 views
0

Ich verwende Spring-Sicherheit und Annotation, um Benutzer über Datenbank und Ldap zu authentifizieren. Im Detail, da Ldap das Abrufen von Attributen nicht erlaubt, überprüfe ich, ob Benutzer (eindeutiger Code) und Passwort korrekt sind, durch eine Ldap-Suche und benutze dann meine Datenbank, um Autoritäten zu laden. Also alle Benutzer in meiner Datenbank existieren in Ldap, aber wenn ein Benutzer in Ldap existiert und nicht in meiner Datenbank, zeige ich eine bestimmte Seite an. Dies ist der eigentliche Code:Spring-Sicherheitsauthentifizierung durch Datenbank mit benutzerdefiniertem Benutzer

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, proxyTargetClass = true) 
@PropertySource(value = { "classpath:application.properties" }) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 


    @Autowired 
    AuthenticationConfiguration authenticationConfiguration; 

    @Configuration 
    protected static class AuthenticationConfiguration implements 
    AuthenticationProvider { 

     @Autowired 
     private UserServices userServices; 
     @Autowired 
     LdapServices ldapServices; 

     @Override 
     public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
      Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>(); 
      String name = authentication.getName(); 
      String password = authentication.getCredentials().toString(); 
      boolean isFind = ldapServices.ldapSearch(name, password);       
      if (isFind){ 
       com.domain.User user = userServices.getByUsersEnabled(name); 
       if (user!=null) 
        authorities.add(new SimpleGrantedAuthority("ROLE_"+user.getRole().getRole()));   
       return new UsernamePasswordAuthenticationToken(name, password, authorities); 
      }   
      else return null; 
     } 


     @Override 
     public boolean supports(Class<?> authentication) { 
      return authentication.equals(UsernamePasswordAuthenticationToken.class); 
     } 
    } 

    @Autowired 
    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(authenticationConfiguration); 
     } 

...web services authentication 

ich einfach Benutzer haben, und ich möchte einige Informationen wie Name/Vorname und E-Mail hinzuzufügen. Ich lese, dass ich UserDetails und loadUserByUsername von UserDetailsService Schnittstelle implementieren muss, aber wie kann ich loadUserByUsername mit meinem Code zusammenführen? Auf diese Weise kann ich den Namen und Nachnamen anstelle des Benutzercodes anzeigen.

Dank

Antwort

0

Ich änderte return new UsernamePasswordAuthenticationToken(name, password, authorities); mit return new UsernamePasswordAuthenticationToken(user, password, authorities); und in meinem HTML-Seite, die ich verwenden sec:authentication="principal.name" name-Parameter abzurufen

0

ich auch einige Probleme mit einem ähnlichen Problem mit, und dann fand ich einen großen Artikel, die mir geholfen, es zu bekommen erledigt. Der Artikel ist hier: spring-ldap-custom-authorities

Ich hoffe, es hilft. Grundsätzlich müssen Sie den Authentifizierungsprozess auf dem LDAP-Server durchführen, und Sie müssen ein "CustomLdapAuthoritiesPopulator" erstellen, damit Sie die Benutzerdetails später abrufen können.

Sie würden so etwas wie dies auf dem XML haben müssen:

<beans:bean id="ldapAuthProvider" 
    class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider"> 
    <beans:constructor-arg> 
     <beans:bean 
      class="org.springframework.security.ldap.authentication.BindAuthenticator"> 
      <beans:constructor-arg ref="contextSource" /> 
      <beans:property name="userSearch" ref="userSearch" /> 
     </beans:bean> 
    </beans:constructor-arg> 
    <beans:constructor-arg> 
     <!-- User roles --> 
     <beans:bean class="com.company.package.CustomLdapAuthoritiesPopulator" /> 
    </beans:constructor-arg> 
</beans:bean> 

Und später auf Ihrem CustomLdapAuthoritiesPopulator würden Sie den Benutzer rolers beschäftigen. Etwas wie dieses:

@Service("myAuthPopulator") 
public class CustomLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator { 
    @Transactional(readOnly=true) 
    @Override 
    public Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username) { 

     Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>(); 
     try { 

      User user = userService.findUserByUsername(username); 

      if (user == null) { 
       // User doesn't exist in the database 
      } else { 

       // user exists 

       //get roles 
       Set<UserRole> userRoles = user.getUserRoles(); 

       //add roles 
       for (UserRole userRole : userRoles) { 
        authorities.add(new SimpleGrantedAuthority(userRole.getRole())); 
       } 

       return authorities; 
      } 
     } catch(Exception e) { 
      //exception 
     } 
     return authorities; 
    } 

} 
+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/17660666) –

+0

Hallo @ProkashSarkar, danke für deine Antwort. Ich habe die Antwort bearbeitet und etwas Code hinzugefügt. Ich denke, es ist jetzt besser. –

Verwandte Themen