2015-01-07 65 views
0

我們的應用程序的身份驗證是通過siteminder代理髮生的,但授權是通過我們的應用程序控制的。Spring安全 - 預認證 - 數據庫中定義的授權和集合角色

我正在使用org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter檢查標題。我還定義了UserDetailsS​​ervice來加載用戶的詳細信息。

我還需要爲用戶設置角色,以便我可以使用彈簧安全標記庫和其他彈簧方法來檢查角色並顯示選項。

我該如何實施?

我已經在我的用戶詳細信息服務實現中嘗試了下面的語句,但似乎沒有工作。

Authentication auth = new UsernamePasswordAuthenticationToken(user, null, roles); 
    SecurityContextHolder.getContext().setAuthentication(auth); 

我也讀過關於AbstractPreAuthenticatedProcessingFilter類,但看起來像這可能沒有用於此目的。

在這個問題上的任何幫助將是非常有益的。

謝謝!

+0

您的_RequestHeaderAuthenticationFilter_擴展了您正在討論的_AbstractPreAuthenticatedProcessingFilter_。你很好。但是您還需要設置_PreAuthenticatedAuthenticationProvider_。你需要提供你的安全配置文件給別人來幫助你更好。 – Angad

+0

謝謝你對Angad的迴應。我使用Spring Security提供的PreAuthenticatedAuthenticationProvider,但沒有擴展它來設置角色。 – Sanjeev

回答

1

我試圖在UserDetailsS​​ervice 實現中設置角色(使用我的問題中的語句)並且它不起作用。

解決方案1: 我寫了一個子類PreAuthenticatedAuthenticationProvider並重寫爲下面的身份驗證方法:

public class CustomPreAuthenticatedAuthenticationProvider extends PreAuthenticatedAuthenticationProvider { 


    @Autowired 
    DBConfig dbConfig; 

    @Override 
    public Authentication authenticate(Authentication authentication)throws AuthenticationException { 
     Authentication auth = super.authenticate(authentication); 

     User user = (User)auth.getPrincipal(); 

     Set<Role> roles = new HashSet<Role>(); 

     String[] rolesArray = dbConfig.getRoles(user.getAccessLevel()); 
     for(String role: rolesArray){ 
      Role r = new Role(); 
      r.setName(role); 
      roles.add(r); 
     } 

     user.setRoles(roles); 

     auth = new UsernamePasswordAuthenticationToken(user, null, roles); 

     return auth; 
    } 


} 

解決方案2: 我試圖在控制器設置的角色(認證後的主頁),它的工作。但看起來像解決方案-1是一個標準的解決方案。

+1

解決方案-1顯然更可取。但我更喜歡在UserDetailsS​​ervice中保留角色獲取邏輯。爲此,你需要的是用普通類型_PreAuthenticatedAuthenticationToken_實現Spring提供的類_AuthenticationUserDetailsS​​ervice_並且重寫_loadUserDetails()_方法來編寫你的角色邏輯 – Angad