在Play中处理用户管理的推荐方法是什么!框架?
这是我的设置:
UserAwareControllerBase
作为控制器的基类Security
类扩展Secure.Security
,仅允许已登录用户的控制器使用@With(Secure.class)
注释(我还没有实现真正的密码/登录系统,只需输入正确的电子邮件即可登录.TBD)
设置很好,因为控制器不需要费心编写用户管理代码,并且可以通过调用getUser()
轻松获取登录用户。但是,我已经开始感受到这种设置的局限性了。我正在获得一个复杂的继承层次结构,如果我想继承CRUD class,我就会遇到问题。
在Play中处理用户身份验证/授权的最佳做法是什么!不重复代码?
UserAwareControllerBase.java
public abstract class UserAwareControllerBase extends Controller {
protected final static UserRepository userRepo = new UserRepository();
@Before
static void setConnectedUser() {
if(Security.isConnected()) {
User user = userRepo.findByEmail(Security.connected());
renderArgs.put("user", user);
}
}
static User getUser() {
return renderArgs.get("user", User.class);
}
}
template.html
<div id='header'>
...
#{if user}
<a href="@{Secure.logout()}">Log out (${user.email})</a>
#{/if}
#{else}
<a href="@{Secure.login()}">Log in</a>
#{/else}
</div>
Security.java
public class Security extends Secure.Security {
protected final static UserRepository userRepo = new UserRepository();
static boolean authenticate(String username, String password) {
User user = userRepo.findByEmail(username);
return user != null;
}
public static void onDisconnected() {
Application.index();
}
}
答案 0 :(得分:2)
如果要在控制器之间共享代码,请使用@With注释而不是使用继承。
对于用户管理,我习惯在onAuthenticated方法中为会话添加一些权限
static void onAuthenticated() {
session.put(Const.MY_RIGHT, true);
}
然后我的检查方法是
static boolean check(String profile) {
return Boolean.parseBoolean(session.get(profile));
}
有了这个,我可以使用@check注释来检查用户权限。在onAuthenticated方法中,您可以执行任何想要将复杂权限管理映射到简单常量的任何内容。