未命中 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.Authentification 或 play.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);
}
}
我正在尝试通过扩展 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.Authentification 或 play.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);
}
}