Play Framework 2.4授权

Play Framework 2.4 authorization

我有一个代表用户系统的class(帐户)。帐户包含一个字段角色。它是包含三种情况的枚举。 帐户 class

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

}

如何实现授权?

我想你可以使用 Deadbolt-2 library, listed in the Play Framework plugins

本着不重新发明轮子的相同想法,您是否看过 Play-Authenticate 插件?最后一个的另一个优点是它与 Deadbolt-2 兼容。

Deadbolt-2 库是一个解决方案。然而,如果你想建立自己的,首先,你需要阅读 https://www.playframework.com/documentation/2.4.x/ScalaActionsComposition

其实并没有那么难,你可以实现几乎无限的、非常灵活的解决方案。

基本思路是定义一个 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,你甚至可以提取额外的用户信息,提供给后面的action,比如上面的anyAction。