2015-09-15 69 views
1

我試圖通過擴展Security.Authenticator類來實現Play的驗證。我使用Play 2.4.2(Damiya),這是我的代碼。Play的默認安全驗證篩選器未命中

public class Secured extends Security.Authenticator{ 

    public Secured() { 
     Logger.info("In secured constructor...."); 
    } 

    @Override 
    public String getUsername(Context context) { 
     return context.session().get("loggedin_user"); 
    } 

    @Override 
    public Result onUnauthorized(Context context) { 
     return redirect(routes.Application.index()); 
    } 
} 

我認爲這個擴展了Security.Authenticator的類作爲J2EE篩選器攔截每一個請求。但是我還沒有看過一次構造函數記錄器的打印。糾正我,如果我誤解了Security.Authenticator的概念,讓我知道它是如何工作的。

我試圖使用@Security.Authenticated控制器中的一個動作方法的頂部和類甚至沒有編譯,儘管拋出以下編譯時錯誤。

package Security does not exist Security.Authenitcated 

我猜有些庫丟失,是遊戲的認證的播放2.4.2版本改變的過程?此Secured類是否過濾所有請求以檢查身份驗證?

更新:play.mvc.Security.Authenticated在頂部保持@Authenticated註解在控制器請求的動作方法後,在安全監控系統的類被過濾。我注意到每次通過Security類傳遞請求時,都會打印構造函數記錄器消息。這是否意味着每次創建一個新的Secured對象?

回答

1

你有沒有導入Security.Authentificationplay.mvc.Security.Authenticator

import Security.Authentification; 

的情況下,我收到

Compilation error[package Security does not exist] 

在的情況下,

import play.mvc.Security.Authenticator; 

所有按預期工作。所以我很確定你只是做了錯誤的導入。

更新:我注意到,每次請求通過Security類過去了,它的構造函數打印記錄消息每次創建新的擔保對象時這是否意味着?」

是。我檢查Play source code並驗證它每次通過請求時都會創建新的實例。

Authenticator authenticator = injector.instanceOf(configuration.value()); 
String username = authenticator.getUsername(ctx); 
+0

是的,我之前使用** play.mvc.Security.Authenticator **,但是正如我使用@ Security.Authenticated它在Play 2.4.2中不起作用。更新我的問題。 – srk

+0

我在Play 2.4.2中驗證了這段代碼 - 它的工作原理與2.4.0中的完全相同 –

+0

對我而言,只需導入這個** import play.mvc.Security; ** 註釋** @ Security.Authenticated **已經工作。 – srk

2

我知道你已經找到你的答案你的問題,但如果你想使用一個注入的服務在您的Security.Authenticator實現,你可能會(因爲玩2.4。*使用DI),你會出現注射錯誤。這是一個問題播放2.4.2和解決在新的播放2.4.3版本。我建議你升級你的Play版本。 這個問題可以在link找到。

作爲一個例子,在2.4.2中會導致錯誤,但不會在2.4中。3;

@Singleton 
public class SecurityGuard extends Security.Authenticator { 

    String message;  

    @Inject 
    Response response; // injected play service 

    @Override 
    public String getUsername(Http.Context ctx) { 
     // removed code 
    } 

    @Override 
    public Result onUnauthorized(Http.Context ctx) { 
     return response.unauthorized(message); 
    } 

}