簡體   English   中英

Play框架和Deadbolt重定向onAuthFailure

[英]Play Framework and Deadbolt redirect onAuthFailure

我已經從Play Framework實現了自己的Authenticator,而從Deadbolt實現了DeadboltHandler。

使用各自的onUnauthorized onAuthFailure方法,我可以發送未登錄到“登錄頁面”的用戶,而不是他們嘗試訪問的實際頁面。

但是,不是要直接將用戶發送到“登錄頁面”,而是要根據用戶嘗試訪問的頁面來指定應將用戶發送到哪個頁面。 例如,如果用戶嘗試訪問/ settings,則應將其重定向到登錄頁面。 如果用戶嘗試訪問/ player / 1,則應將用戶重定向到另一個頁面,例如“創建用戶”頁面。

我希望可以通過一些聰明的方法來使用注釋,例如:@someannotation(redirect = route / id),這樣,如果用戶未登錄,我可以重定向到相關的路由,否則可以重定向到標准的“登錄”頁面”。

任何人有任何想法嗎?

控制器和路由方法的代碼片段示例:

@Security.Authenticated(Secured.class)
@SubjectPresent(content = "createuser")
@DeferredDeadbolt
public class Settings extends Controller {

    @SubjectPresent(content = "login")
    @CustomRestrict(value = { @RoleGroup({ UserRole.player}), @RoleGroup(UserRole.server_owner) })
    public static Result settings() {

DeadboltHandler onAuthFailure的代碼片段示例:

@Override
    public F.Promise<Result> onAuthFailure(Http.Context context, String content) {
        return F.Promise.promise(new F.Function0<Result>() {
            @Override
            public Result apply() throws Throwable {
                System.out.println(content);

您可以通過兩種不同的方法來執行此操作。

方法1:重新利用content

在這種方法中,您可以使用約束注釋的content值來提示處理程序。 您可以使用類級別的約束來定義默認重定向,例如轉到登錄頁面,並使用方法級別的約束來覆蓋默認重定向。 所有約束都具有content值,我SubjectPresent為例。 您還可以混合使用約束,例如,在類級別使用SubjectPresent ,在方法級別使用Restrict

@SubjectPresent(content = "login")
public class FooController extends Controller {

    public Result settings() {
        // ...
    }

    public Result somethingElse() {
        // ...
    }

    @SubjectPresent(content = "create-user")
    public Result viewUser() {
        // ...
    }
}

然后,在DeadboltHandler實現中,您需要對內容進行測試:

public CompletionStage<Result> onAuthFailure(final Http.Context context,
                                             final Optional<String> content) {
    return CompletableFuture.supplyAsync(() -> content.map(redirectKey -> {
        final Result result;
        if ("login".equals(redirectKey)) {
            result = [redirect to login action]
        }
        else if ("create-user".equals(redirectKey)) {
            result = [redirect to create user action]
        } else {
            result = [redirect to default authorization failure action]
        }
    }).orElseGet(() -> [redirect to default authorization failure action]), executor);
}

方法2:使用ROUTE_PATTERN標記

您可以使用請求中指定的路由來確定所請求的操作,而不必在約束注釋中指定鍵。

public CompletionStage<Result> onAuthFailure(final Http.Context context,
                                             final Optional<String> content) {
    final String route = requestHeader.tags().get(Router.Tags.ROUTE_PATTERN);
    // examine the route and work out what you want to do
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM