问题描述
我有一个代表用户系统的类(Account)。 帐户包含字段角色。 这是包含三个案例的枚举。 帐户类
public class Account extends Model {
@Id
@Email
public String email;
@Required
@NotNull
public String password;
@Required
@NotNull
public String firstName;
@Required
@NotNull
public String lastName;
@Required
public String phone;
public MyRole role;
我的角色
public enum MyRole {
ADMIN,
TEACHER,
USER
}
我如何实施授权?
1楼
我想你可以使用列出的库。
在不重新发明轮子的想法中,您是否看过插件? 最后一个的另一个优点是它与Deadbolt-2兼容。
2楼
Deadbolt-2库是一个解决方案。 但是,如果您想构建自己的,首先需要阅读 。
实际上,它并不困难,您可以实现几乎无限的,非常灵活的解决方案。
基本思想是定义UserAuthAction,如:
@Singleton
class UserAuthAction @Inject() (principalService: PrincipalService) extends ActionBuilder[Request] with ActionFilter[Request] {
override protected def filter[A](request: Request[A]) = Future.successful {
request.session.get(principalService.accessTokenCacheKey).map { accessToken =>
if (principalService.authenticate(accessToken))
None
else
Some(Results.Redirect(routes.PrincipalController.login()))
} getOrElse {
Some(Results.Redirect(routes.PrincipalController.login()))
}
}
}
然后用实际工作的动作来组合它。 例如:
@Singleton
class Application @Inject() (userAuthAction: UserAuthAction) extends Controller {
def index = (userAuthAction andThen anyAction) { request =>
Ok(views.html.index())
}
}
在此过程中,如果您使用的是ActionRefiner,您甚至可以提取其他用户信息并将其提供给后面的操作,例如上面的anyAction。