我一直在玩游戏! 2.1遵循ZenTasks示例设置基本登录系统的示例。我陷入困境的是JavaForms部分。我想使用Guice DI提供的auth服务实例来验证登录请求。
我正在关注Play20 Sample。此示例使用静态authenticate()
方法在表单提交后请求表单验证时运行身份验证。关于如何在非静态范围内执行此验证步骤的任何想法?
注意:我看过Play!验证插件以及SecureSocial插件,但是这些项目对我现在想做的事情来说太过分了。另外,我感兴趣的是允许在JavaForms中进行非静态验证的一般解决方案。
修改 似乎对我在这里要求的内容存在一些困惑。我希望找到的是另一种方法来执行Play发送的表单提交的验证步骤!框架Form.form()生成的表单。目前,它要求在POJO的实例上调用validate()方法,该方法不是通过DI框架创建的。这导致访问授权服务等需要静态引用...
编辑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;
}
}
这是一个好的解决方法,但它仍然依赖静态注入:(
答案 0 :(得分: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 Framework,而是Java编程。
答案 1 :(得分:0)
假设您use Spring,您可以像在任何其他Java程序中那样执行此操作:
@Configurable
public class MyModel {
@Autowired
transient MyService myService;
public String validate() { ... }
}
@Configurable
注释使该类能够依赖注入。瞬态限定符确保该字段不会被作为一个字段保存到数据库中。
Spring在我的一个项目中使用Play 2.0 / 2.1很好。我不认为模型对象中的依赖注入在美学上令人愉悦,但如果你需要它,你可以使用它。