Как использовать безопасность Google App Engine в Wicket? - PullRequest
2 голосов
/ 20 июля 2011

Я разрабатываю приложение Wicket GAE, и все выглядит хорошо.Но у меня есть один вопрос, как правильно интегрировать безопасность GAE с Wicket?

У меня есть два случая использования, связанных с безопасностью:

  1. Страницы, разрешенные для аутентифицированных пользователей: только зарегистрированый пользователь может видетьих - другие пользователи должны быть перенаправлены на аутентификацию Google (и, после успеха, вернуться на ту же страницу)
  2. Страницы с действиями, разрешенными для некоторых пользователей: любой пользователь может видеть страницу, но могут запускать только специальные пользователи.действия (например, любой может читать новости, но редактировать может только автор конкретного поста).

Второе, я полагаю, я могу сделать, "скрыв" формы и / или действия (другие предложения приветствуются).Первый, который я не смог найти, как это сделать.

GAE дает указание использовать аутентификацию на основе сервлетов или некоторые вызовы API для перенаправления на аутентификацию Google с обратной ссылкой.Я думаю, это работает с перенаправлением Wicket, но не должно ли это быть перенаправлением 401?И, что более важно: как это проверить?

Если я пользуюсь безопасностью Wicket, как я могу определить, к каким страницам пользователь может получить доступ и как отправить их в Google Auth?

1 Ответ

0 голосов
/ 05 сентября 2011

Функции безопасности библиотеки visural-wicket (полное раскрытие - это мой проект с открытым исходным кодом) могут позволить интеграцию, которую вы ищете.

В этом блоге объясняется основной механизм -

http://www.richardnichols.net/2011/09/securing-wicket-with-visural-wicket/

Вы можете интегрироваться с безопасностью Google, используя их UserService для возврата IClient, обертывающего пользователя google -

public class GoogleUser implements IClient<String> {
    private final User user;
    private final boolean admin;
    public GoogleUser(User user, boolean admin) {
        this.user = user;
    }    
    public String getId() {
        return user.getUserId();
    }
    public User getUser() {
        return user;
    }
    public boolean isAdmin() {
        return admin;
    }
}

public class MyApp extends Application {

    public void init() {
        // ...
        getSecuritySettings().setAuthorizationStrategy(new com.visural.wicket.security.AuthorizationStrategy(new IClientProvider() {
            public IClient getCurrentClient() {
                UserService s = UserServiceFactory.getUserService();
                return new GoogleUser(s.getCurrentUser(), s.isUserAdmin());
            }
        }));
        // ...
    }
}

Затем вы можете реализовать защиту на своих страницах или компонентах, как это -

public class MyPage extends WebPage implements ISecureRenderInstance {
    // ...

    public IPrivilege getRenderPrivilege() {
       return new IPrivilege<GoogleUser>() {
           public boolean isGrantedToClient(GoogleUser client) {
               return client != null && client.isAdmin()
           }
       };
       // instead of returning a anonymous class like this, you could also
       // package up common privileges into a singleton instance,
       // e.g. return Privilege.ADMIN;
    }
}
...