2

我一直在玩游戏!2.1 示例按照 ZenTasks 示例设置基本登录系统。我卡住的地方是 JavaForms 部分。我想使用通过 Guice DI 提供的身份验证服务的实例来验证登录请求。

我正在关注Play20 Sampleauthenticate()此示例在表单提交后请求表单验证时使用静态方法运行身份验证。关于如何在非静态范围内执行此验证步骤的任何想法?

注意:我看过Play!验证插件以及 SecureSocial 插件,但是这些项目对于我现在想做的事情来说太过分了。此外,我对允许在 JavaForms 中进行非静态验证的通用解决方案感兴趣。

编辑: 我在这里要求的内容似乎有些混乱。我希望找到的是另一种方法来执行由 Play 发送的表单提交的验证步骤!框架 Form.form() 生成的表单。目前,它要求在不是通过 DI 框架创建的 POJO 实例上调用 validate() 方法。这导致访问授权服务等需要静态引用...

编辑 2: 我正在使用的当前解决方案是:

public static class AuthServiceFormReference {
    @Inject
    public static Provider<AuthService> authService;        
}

// In my auth module configure()
//...
    requestStaticInjection(AuthController.AuthServiceFormReference.class);
//...

public static class Login {
    @Required
    public String email;
    @Required
    public String password;

    public String validate(){
        if(AuthServiceFormReference.authService.get().authenticateAdmin(email, password) == null) {
            return "Invalid user or password";
        }
        return null;
    }
}

这是一个不错的解决方法,但它仍然依赖于静态注入:(

4

2 回答 2

0

假设您使用 Spring,您可以像在任何其他 Java 程序中一样执行此操作:

@Configurable
public class MyModel {
    @Autowired
    transient MyService myService;

    public String validate() { ... }
}

注释使@Configurable类能够进行依赖注入。瞬态限定符确保该字段不会被拾取为要保存到数据库中的字段。

在我的一个项目中,Spring 与 Play 2.0/2.1 配合得很好。我不认为模型对象中的依赖注入美观,但如果你需要它,你可以使用它。

于 2013-01-24T13:28:36.323 回答
0

Play Framework 不提供Dependency Injection开箱即用的功能。但是,您可以将其与 Guice 或 Spring 集成。作为一个懒惰的开发人员,您还可以Singleton为该服务创建一个,或使其成为一个插件(因为它可能需要为应用程序启动做准备工作)。然后,您可以获得对您的插件的引用 - Play.application().plugin(AuthPlugin.class)

在这种特殊情况下,您可以在验证方法中进行数据库查找,例如

User u = User.find.where().eq("username", username).eq("password`,password).findUnique();
if (u == null)
 return "Error.";
else
 return null;

所以这不是关于 Play 框架,而是一般的 Java 编程。

于 2013-01-23T17:16:01.333 回答