Play!框架用户管理的最佳实践是什么?

3
在Play!框架中,处理用户管理的推荐方式是什么?
这是我的设置:
- 以UserAwareControllerBase为控制器的基类 - 主视图模板包括登录/注销按钮 - 自定义Security类扩展Secure.Security,只允许已登录用户的控制器带有@With(Secure.class)注解
(我还没有实现真正的密码/登录系统,只需输入正确的电子邮件即可登录。待定)
这种设置很好,因为控制器不需要费心编写用户管理代码,可以通过调用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();
    }
}
1个回答

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方法中,您可以将复杂的权限管理映射到简单的常量中,以便进行任何操作。


谷歌似乎不知道@With的文档在哪里。 - ripper234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接