2012-10-10 31 views
2

我試圖在Web應用程序中使用Spring安全性與LDAP實現登錄成功處理程序。網上搜索後,我發現的唯一途徑是實現像這樣一個自定義的用戶信息映射:春季安全LDAP成功處理程序

public class CustomUserDetailsMapper extends LdapUserDetailsMapper{ 

private static final String ROLE_NORMAL_USER = "Normal User"; 
private static final String ROLE_ADMIN = "Administrator"; 
@Override 
public UserDetails mapUserFromContext(DirContextOperations ctx, 
     String username, Collection<? extends GrantedAuthority> authority) { 
    UserDetails originalUser = super.mapUserFromContext(ctx, username, authority); 


    originalUser.getAuthorities(); 

    Set<AndaAuthority> roles = EnumSet.noneOf(AndaAuthority.class); 

    roles.add(AndaAuthority.ROLE_ADMIN); 

    for (GrantedAuthority auth : authority) { 
     if (ROLE_NORMAL_USER.equalsIgnoreCase(auth.getAuthority())) { 
      roles.add(AndaAuthority.ROLE_USER); 
     } else if (ROLE_ADMIN.equalsIgnoreCase(auth.getAuthority())) { 
      roles.add(AndaAuthority.ROLE_ADMIN); 
     } 
    } 

    SecurityContextHolder.getContext().getAuthentication().getCredentials(); 

    User newUser = 
      new User( 
      originalUser.getUsername(), 
      originalUser.getPassword() != null? originalUser.getPassword():"", 
      originalUser.isEnabled(), 
      originalUser.isAccountNonExpired(), 
      originalUser.isCredentialsNonExpired(), 
      originalUser.isAccountNonLocked(), 
      roles); 

      return newUser; 
} 
} 

這是工作 - 當我把一個斷點在這裏停止。但是,有沒有更好的方法來實現這種情況下的處理程序?我的意思是,整個身份驗證部分完成「引擎蓋下」,我不能真正調試,如果出現錯誤,並沒有調用這個方法,我沒有其他方式知道在路上出了什麼問題。

謝謝

+0

目前還不清楚你的問題是什麼,因爲你沒有真正說出你想做什麼。另外,你是什麼意思「引擎蓋下」?您可以輕鬆地在任何Spring Security類中添加斷點,並且在IDE中將源代碼添加到項目中並不重要。所以這是不正確的,你不能調試。從Java的角度來看,它只是應用程序的另一部分。 –

+0

我想重寫默認的onSuccess或類似的東西從春季安全知道登錄是否成功/或不是每個情況下做不同的操作。 – AndaP

+0

那麼,它仍然一般取決於「操作」是什麼。你可以使用'AuthenticationSuccessHandler'。您可以在網站的其他地方和參考手冊中找到它們。 –

回答

1

對於任何人想知道: 您必須聲明你的成功處理程序作爲一個bean,所以你可以在你的春季安全配置鏈接。

here實施效果很好, 你只需要聲明你authentication-success-handler-ref<form-login>配置標記和覆蓋onAuthenticationSuccess方法。

其他更好的解決方案可能存在,但這是我發現和工作在我的情況。