Play Framework 2.4授权

时间:2015-07-23 10:07:43

标签: java playframework playframework-2.4

我有一个代表用户系统的类(Account)。帐户包含字段角色。这是包含三个案例的枚举。 帐户类

Map<Key, ClassB> myMap = classAList.stream()
    .collect(Collectors.toMap(Key::key, ClassB::new, (b1,b2)->{
        b1.appendFieldA(b2.getFirstInstanceA().getFieldA());
        return b1;
    }));

MyRole

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;

如何实施授权?

2 个答案:

答案 0 :(得分:1)

我认为您可以使用Deadbolt-2中列出的Play Framework plugins库。

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

答案 1 :(得分:1)

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。