Play Framework 2.4 授权

3

我有一个代表用户系统的类(Account)。Account包含一个字段role。这是一个包含三种情况的枚举。 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,请查看快速入门指南 - Steve Chaloner
2个回答

1

0

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,甚至可以提取其他用户信息并将其提供给后续操作,例如上面的anyAction。


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