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。
我有一个代表用户系统的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。