Play Framework برای مباحث کنترل دسترسی بصورت پیش فرض مفهومی با نام Authenticator دارد، شما می توانید یک کلاس داشته باشید که از کلاس Authenticator ارث برده است:
package controllers;
import play.*;
import play.mvc.*;
import play.mvc.Http.*;
import models.*;
public class Secured extends Security.Authenticator {
@Override
public String getUsername(Context ctx) {
return ctx.session().get("email");
}
@Override
public Result onUnauthorized(Context ctx) {
return redirect(routes.Application.login());
}
}
کلاس Secured متد های onUnauthorized و getUsername را override کرده است.
پس از لاگین کردن کاربر در صفحه لاگین، می توانیم ایمیل و یا نام کاربری کاربر را درون session کاربر ذخیره کنیم:
public static Result authenticate() {
Form<Login> loginForm = Form.form(Login.class).bindFromRequest();
if (loginForm.hasErrors()) {
return badRequest(login.render(loginForm));
} else {
session().clear();
session("email", loginForm.get().email);
return redirect(
routes.Application.index()
);
}
}
حالا action را که می خواهیم امن باشد را با انوتیشن Authenticated علامت گذاری می کنیم:
@Security.Authenticated(Secured.class)
public static Result admin() {
...
حالا در صورتی که متد getUsername برای دسترسی به این action مقدار null را برگرداند، play جلوی دسترسی به این action را می گیرد و سپس متد onUnauthorized را فراخوانی می کند.
اگر بخواهید درون بدنه action کاربر جاری که لاگین کرده را نیز بدست بیاورید می توانید از متد username در خواست جاری استفاده کنید:
@Security.Authenticated(Secured.class)
public static Result admin() {
return ok(admin.render(
Project.findInvolving(request().username()),
Task.findTodoInvolving(request().username()),
User.find.byId(request().username())
));
}
برای پیاده سازی سیستم کنترل دسترسی پیچیده تر (مثلا role based) می توانید از قابلیت Action composition استفاده کنید و annotation های خاص خود را پیاده سازی کنید.