калитка и CompoundAuthorizationStrategy - PullRequest
       2

калитка и CompoundAuthorizationStrategy

2 голосов
/ 27 февраля 2012

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

Я пытаюсь добиться правильного перенаправления.В моем классе WebApplication у меня есть:

init() {
//...ommited some not related code
    CompoundAuthorizationStrategy compoundAuthorizationStrategy = new CompoundAuthorizationStrategy();
    IAuthorizationStrategy membertPageAuthStrategy = new SimplePageAuthorizationStrategy( MemberTemplatePage.class,
            HomePage.class )
    {
        @Override
        protected boolean isAuthorized()
        {
            //here's my way to define if authorization is completed
        }
    };

    IAuthorizationStrategy adminPageAuthStrategy = new SimplePageAuthorizationStrategy( AdminTemplatePage.class,
            AdminLoginPage.class )
    {
        @Override
        protected boolean isAuthorized()
        {
            //here's my way to define if authorization is completed
        }
    };

    compoundAuthorizationStrategy.add( membertPageAuthStrategy );
    compoundAuthorizationStrategy.add( adminPageAuthStrategy );

    getSecuritySettings().setAuthorizationStrategy( compoundAuthorizationStrategy );
//...
}

MemberTemplatePage - шаблон для входа на страницу пользователя, в то время как AdminTemplatePage - то же самое для администратора.Теперь я думаю, что с помощью этой цепочечной стратегии авторизации я буду перенаправлен на HomePage, когда я вхожу в MemberTemplatePage неавторизованным, и в AdminLoginPage, когда я вхожу неавторизованным в AdminTemplatePage, но я буду перенаправлен на AdminTemplatePage.Не могу ничего гуглить на CompoundAuthorizationStrategy, и, похоже, это лучший выбор для меня.Есть идеи, что я делаю не так?Я знаю о RoleAuth ~, но это не для меня.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

@ roby Вы, вероятно, правы, после некоторого поиска в источнике калитки я делаю это изменение в своем коде:

init() {
//...ommited some not related code
CompoundAuthorizationStrategy compoundAuthorizationStrategy = new CompoundAuthorizationStrategy();
IAuthorizationStrategy membertPageAuthStrategy = new SimplePageAuthorizationStrategy( MemberTemplatePage.class,
        HomePage.class )
{
    @Override
    protected boolean isAuthorized()
    {
        if ( /* user not authorized */ )
            {
                throw new RestartResponseAtInterceptPageException( HomePage.class );
            }
            return true;
    }
};

IAuthorizationStrategy adminPageAuthStrategy = new SimplePageAuthorizationStrategy( AdminTemplatePage.class,
        AdminLoginPage.class )
{
    @Override
    protected boolean isAuthorized()
    {
        if ( /* user not authorized */ )
            {
                throw new RestartResponseAtInterceptPageException( AdminLoginPage.class );
            }
            return true;
    }
};

compoundAuthorizationStrategy.add( membertPageAuthStrategy );
compoundAuthorizationStrategy.add( adminPageAuthStrategy );

getSecuritySettings().setAuthorizationStrategy( compoundAuthorizationStrategy );
//...
}

И это работает так, как я хотел:)

0 голосов
/ 28 февраля 2012

Это код из CompoundAuthorization

public final boolean isInstantiationAuthorized(Class componentClass)
{
    int size = strategies.size();
    for (int i = 0; i < size; i++)
    {
        IAuthorizationStrategy strategy = strategies.get(i);
        if (!strategy.isInstantiationAuthorized(componentClass))
        {
            return false;
        }
    }
    return true;
}

Он проверит класс, который вы пытаетесь создать для каждой стратегии, если все проверки успешно завершены, создание экземпляров разрешено.Таким образом, он, вероятно, преуспел во время обычной проверки авторизации пользователя, а затем пытается авторизоваться администратором и перенаправляется на страницу входа администратора.

...