未命中 Play 的默认安全身份验证过滤器

Play's default Security Authentication Filter not hit

我正在尝试通过扩展 Security.Authenticator class 来实现 Play 的身份验证。我正在使用 Play 2.4.2 (Damiya),这是我的代码。

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 的 class 充当 J2EE 过滤器拦截每个请求。但是我还没有看到构造函数记录器打印过一次。如果我误解了 Security.Authenticator 的概念,请纠正我,告诉我它是如何工作的。

我尝试在控制器中的一种操作方法之上使用 @Security.Authenticated,尽管抛出以下编译时错误,class 甚至没有编译。

package Security does not exist Security.Authenitcated

我猜是少了一些库,Play 2.4.2 版本中Play 的身份验证过程是否发生了变化?此 Secured class 是否过滤所有检查身份验证的请求?

更新: 在将来自 play.mvc.Security.Authenticated 的 @Authenticated 注释保留在顶部之后,控制器请求中的操作方法在 Secured class 处被过滤。我注意到每次请求通过安全 class 传递时,它的构造函数记录器消息都会被打印出来。这是否意味着每次创建一个新的 Secured 对象?

您是否导入了 Security.Authentificationplay.mvc.Security.Authenticator

的情况下
import Security.Authentification;

我收到了

Compilation error[package Security does not exist]

import play.mvc.Security.Authenticator;

一切正常。所以我很确定你只是导入错误。

更新:我注意到每次请求通过安全class传递时,都会打印构造函数记录器消息。这是否意味着每次创建新的安全对象时?"

是的。我检查 Play source code 并验证它是否在每次传递请求时创建新实例。

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

我知道您已经找到问题的答案,但如果您想在 Security.Authenticator 实现中使用注入服务,您可能会这样做(因为 Play 2.4.* 使用 DI),你会得到注入错误。这是 Play 2.4.2 的问题,在新的 Play 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);
    }

}