2016-04-07 30 views
0

我希望我的授權機制返回默認用戶,如果未指定BacicAuth的標頭。我試圖這樣做:Dropwizard Auth - 如果沒有給出標題,如何返回默認用戶?

@Override 
    public Optional<User> authenticate(final BasicCredentials basicCredentials) throws AuthenticationException { 

     String email = basicCredentials.getUsername(); 
     String plaintextPassword = basicCredentials.getPassword(); 

     final Optional<User> user = Optional.of(userDao.getUserByEmail(email)); 

     if (user.isPresent()) { 
      return user; 
      } 
     else { 
      return Optional.of(defaultUser); 
     } 
    } 

但是,不知何故,我仍然得到401時,我沒有正確的標題做出請求。

我該如何讓它工作?

回答

2

因此,如果沒有基本身份驗證標頭,空BasicCredentials傳遞給預認證過程,這會導致自動未經授權的錯誤響應。所以我們需要確保有一個標題。爲此,您可以註冊在Dropwizard認證過濾器之前執行的Jersey過濾器。在那裏,我們可以添加一個默認用戶名和密碼的標題。

import java.io.IOException; 
import javax.annotation.Priority; 
import javax.ws.rs.Priorities; 
import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerRequestFilter; 
import javax.ws.rs.core.HttpHeaders; 
import org.glassfish.jersey.internal.util.Base64; 

@Priority(Priorities.AUTHENTICATION - 100) 
public class PreAuthenticationFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext request) throws IOException { 
     boolean hasValidHeader = false; 
     if (request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) { 
      final String header = request.getHeaderString(HttpHeaders.AUTHORIZATION); 
      if (header.toLowerCase().startsWith("basic")) { 
       hasValidHeader = true; 
      } 
     } 
     if (!hasValidHeader) { 
      final String defaultUser = "defaultUser"; 
      final String defaultPassword = "defaultPassword"; 
      final String base64 = Base64.encodeAsString(defaultUser + ":" + defaultPassword); 
      request.getHeaders().putSingle(HttpHeaders.AUTHORIZATION, "Basic " + base64); 
     } 
    } 
} 

然後,只需用DW env.jersey().register(PreAuthenticationFilter.class);

+0

由於註冊吧!它工作得很好 – VanDavv

+0

問題是,如果您使用過濾器,爲什麼不立即在該過濾器中進行身份驗證?在我看來,DW認證有點缺陷,因爲它帶走了一些我認爲很重要的控制權。我更喜歡使用DW的方法在過濾器中進行身份驗證。很多人遇到了我認爲的同樣的問題。 – pandaadb

+0

authN/authZ鏈中有幾個過濾器。首先是認證過濾器。 Dropwizard在此過濾器中使用您的驗證器。 Jersey授權(rolesallowed)過濾器,它調用您的授權人。所以不同的濾鏡處理不同的事情也許你看到有缺陷的不是過程,而是認證過濾器的實現。對於你特定的用例,是的,我同意這是一個負擔,必須使用這項工作。但這只是它的實現。 –

相關問題