Лучшие практики для управления пользователями с Play! Фреймворк? - PullRequest
3 голосов
/ 21 ноября 2011

Какой рекомендуемый способ управления пользователями в Play!Framework?

Это мои настройки:

  • UserAwareControllerBase в качестве базового класса для контроллеров
  • Шаблон основного вида включает кнопку входа / выхода из системы
  • пользовательский Security класс, расширяющий Secure.Security, и контроллеры, которые разрешают вход только зарегистрированным пользователям, помечены @With(Secure.class)

(я еще не внедрил реальный пароль / систему входа в системудостаточно просто ввести правильный адрес электронной почты для входа в систему. TBD)

Настройка хороша, потому что контроллерам не нужно беспокоиться о написании кода управления пользователями, и они могут легко получить зарегистрированного пользователя, вызвав getUser().Тем не менее, я уже начинаю чувствовать ограничения этой настройки.Я получаю сложную иерархию наследования и сталкиваюсь с проблемой, если хочу унаследовать от класса CRUD .

Что является лучшим способом обработки аутентификации / авторизации пользователей в Play!без повторения кода?

UserAwareControllerBase.java

public abstract class UserAwareControllerBase extends Controller {
    protected final static UserRepository userRepo = new UserRepository();

    @Before
    static void setConnectedUser() {
        if(Security.isConnected()) {
            User user = userRepo.findByEmail(Security.connected());
            renderArgs.put("user", user);
        }
    }

    static User getUser() {
        return renderArgs.get("user", User.class);
    }
}

template.html

<div id='header'>
  ...

  #{if user}
   <a href="@{Secure.logout()}">Log out (${user.email})</a>
  #{/if}
  #{else}
    <a href="@{Secure.login()}">Log in</a>
  #{/else}
</div>

Безопасность.java

public class Security extends Secure.Security {
    protected final static UserRepository userRepo = new UserRepository();

    static boolean authenticate(String username, String password) {
        User user = userRepo.findByEmail(username);
        return user != null;
    }

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

1 Ответ

2 голосов
/ 21 ноября 2011

Если вы хотите обмениваться кодом между контроллерами, предпочитайте использовать аннотацию @With, а не наследование.

Для управления пользователями я использую некоторые права в сеансе в методе onAuthenticated, как этот

static void onAuthenticated() {
    session.put(Const.MY_RIGHT, true);
}

И тогда мой метод проверки будет

static boolean check(String profile) {
    return Boolean.parseBoolean(session.get(profile));
}

С этим я могу использовать аннотацию @check для проверки прав пользователя.В методе onAuthenticated вы можете делать все, что хотите, чтобы отобразить сложные управления правами в простые константы.

...