java - Play Framework 和 Deadbolt 重定向 onAuthFailure

标签 java playframework deadbolt

我已经从 Play Framework 实现了自己的 Authenticator,并从 Deadbolt 实现了 DeadboltHandler。

使用 onUnauthorized 和 onAuthFailure 方法,我可以将未登录的用户发送到“登录页面”,而不是他们尝试访问的实际页面。

但是,我不想将用户直接发送到“登录页面”,而是想根据用户尝试访问的页面来指定应将用户发送到哪个页面。例如,如果用户尝试访问/settings,则应将用户重定向到登录页面。如果用户尝试访问/player/1,则应将用户重定向到另一个页面,例如“创建用户”页面。

我希望有一些聪明的方法可以通过注释来做到这一点,例如:@someannotation(redirect = route/id),这样如果用户未登录,我可以重定向到相关路由,否则重定向到标准“登录页面”。

有人有什么想法吗?

Controller 和路由方法的代码片段示例:

@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 值,我只是使用 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
}

关于java - Play Framework 和 Deadbolt 重定向 onAuthFailure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43537398/

相关文章:

java - Deadbolt 2 : Controlling restrictions with DB settings, 完全

java - 我应该关注大量的依赖关系吗?

java - Android 在 Fragment 之间传递数据

Java 泛型 : Can I Use an Object as a Formal Parameter?

java - IOException : Broken pipe

rest - 将通过securesocial保护的Play Framework休息调用暴露给移动应用程序

javascript - 使用 ajax 和 Play Framework 2 发送 Post Json

java - Ebean/Play Framework 关系未更新