0 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)
سیستم احراز هویت (authentication) و کنترل دسترسی در Play Framework چگونه است؟

1 پاسخ

0 امتیاز
قبل توسط (1.1هزار امتیاز)

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 های خاص خود را پیاده سازی کنید.

سوالات مشابه

+2 امتیاز
1 پاسخ 4.9هزار بازدید
0 امتیاز
1 پاسخ 233 بازدید
+1 امتیاز
1 پاسخ 898 بازدید
0 امتیاز
1 پاسخ 230 بازدید
0 امتیاز
1 پاسخ 1.3هزار بازدید
0 امتیاز
1 پاسخ 470 بازدید
...