разрешение только пользователю с правами администратора входить в область администрирования playframework crud

Я пытаюсь выполнить аутентификацию с помощью безопасного модуля playframework. У меня есть два пользователя: один администратор, другой с обычными привилегиями. Они определяются как

User(adminuser):
    email:   [email protected]
    password: secret
    isAdmin:  true
User(normaluser):
    email:   [email protected]
    password: normalpass

Я хочу, чтобы только пользователь с правами администратора мог входить в административную область и создавать объекты с помощью интерфейса crud. Как мне это сделать?

*       /admin          module:crud

вызывает экран входа в систему, на котором после входа в систему два пользователя, указанные выше, переносят их в область администрирования. Как я могу ограничить вход в область администрирования только для пользователя-администратора и сообщить обычному пользователю, что у него недостаточно прав для доступа админка?


person Damon Julian    schedule 29.08.2011    source источник


Ответы (2)


Используя CRUD, вы можете объявить один контроллер для каждой сущности. Затем вы можете добавить аннотации, необходимые для безопасности.

Например, для объекта User у вас будет этот контроллер:

@Check("admin")
@With(Security.class)
@For(models.User.class)
public class Users extends controllers.CRUD {
} 

В @With вы должны указать на класс, расширяющий Secure.Security. Например:

public class Security extends Secure.Security {

    static boolean authenticate(String username, String password) {
        return User.connect(email, password) != null;
    }

    static boolean check(String profile) {
        if("admin".equals(profile)) {
            return User.all().filter("email", connected()).get().isAdmin;
        }
        return false;
    }

    static void onDisconnected() {
        Application.index();
    }

    static void onAuthenticated() {
        Admin.index();
    }
}
person javierhe    schedule 29.08.2011
comment
В этом случае нет необходимости в методах onDisconnected и onAuthenticated, так как Play автоматически перенаправит на страницу входа и страницу запроса;) - person i.am.michiel; 29.08.2011

Я еще не знаком с модулем CRUD, но в вашем контроллере вы можете использовать аннотацию @Check("admin"). Это гарантирует, что перед каждым вызовом аннотированного метода модуль безопасности будет вызывать метод static boolean check(String) в вашем собственном классе реализации Security. Там вы можете просто проверить, является ли текущий пользователь администратором, и разрешить доступ или нет. См. пример ниже.

public class MySecurity extends Secure.Security
{

.... other methods you should/could override ....

static boolean check(String profile)
{
   boolean result = false;
   if("admin".equalsIgnoreCase(profile))
   {
      User currentUser = User.find("byUsername", Security.connected()).first();
      result = currentUser.isAdmin;
   }

   return result;

}

Надеюсь это поможет. /Ричард

person Bjarne77    schedule 29.08.2011
comment
Для большей производительности не проверяйте с помощью ignoreCase и немедленно возвращайте результат вместо создания промежуточного логического значения. - person i.am.michiel; 29.08.2011
comment
Я серьезно сомневаюсь, что промежуточная переменная влияет на производительность. Я бы предпочел беспокоиться о том, как это читается, чем о чем-то, о чем, надеюсь, позаботится JIT. Даже если JIT этого не делает, это не цикл, который выполняется тысячи раз. - person varikin; 20.10.2011