【问题标题】:Play's default Security Authentication Filter not hitPlay 的默认安全验证过滤器未命中
【发布时间】:2015-09-15 07:04:23
【问题描述】:

我正在尝试通过扩展 Security.Authenticator 类来实现 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 的这个类充当 J2EE 过滤器,拦截每一个请求。但是我没有看到一次构造函数记录器打印出来。如果我误解了 Security.Authenticator 的概念,请纠正我,让我知道它是如何工作的。

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

package Security does not exist Security.Authenitcated

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

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

【问题讨论】:

    标签: playframework playframework-2.0 playframework-2.2


    【解决方案1】:

    我知道您已找到问题的答案,但如果您想在您的 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);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

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

      的情况下
      import Security.Authentification;
      

      我收到了

      Compilation error[package Security does not exist]
      

      如果是

      import play.mvc.Security.Authenticator;
      

      一切都按预期工作。所以我很确定你只是做错了导入。

      更新: "我注意到每次请求通过 Security 类时,都会打印它的构造函数记录器消息。这是否意味着每次创建一个新的 Secured 对象? em>"

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

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

      【讨论】:

      • 是的,我之前使用的是 play.mvc.Security.Authenticator,但是当我使用 @Security.Authenticated 时,它在 Play 2.4.2 中不起作用。更新了我的问题。
      • 我在 Play 2.4.2 中验证了此代码 - 它的工作方式与 2.4.0 完全相同
      • 对我有用的是只需导入这个 import play.mvc.Security; 注释 @Security.Authenticated 就可以了。
      • 我在我的 2.4.2 项目中验证了您的 Secured 类 - 它有效,所以我不太确定您还有什么问题。
      • 检查我有问题的更新。
      猜你喜欢
      • 1970-01-01
      • 2016-11-05
      • 2023-03-29
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 2016-07-12
      • 2012-10-15
      • 2012-05-03
      相关资源
      最近更新 更多