Spring Security: разрешить просмотр страниц для всех пользователей, прошедших полную проверку подлинности, если они не имеют определенной роли - PullRequest
4 голосов
/ 06 октября 2010

Я использую Spring 3.0.3 с Spring Security.

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

Итак, было бы хорошо использовать:

<security:intercept-url pattern="/**" access="isFullyAuthenticated()" requires-channel="https"/>

Но теперь я хочу иметь возможность запретить людям использовать приложение, если мне нужно, поэтому я создал роль с именем ROLE_BANNED в надежде, что смогу просто назначить роли тем людям, у которых есть проблемы.

Итак, сейчас я пытаюсь это:

<security:intercept-url pattern="/**" access="isFullyAuthenticated() and not hasRole('ROLE_BANNED')" requires-channel="https"/>

Поначалу это сработало, но не может загрузить мою запрещенную страницу. Я считаю, что это ограничивает доступ к запрещенной странице. Я не могу загрузить запрещенную страницу через контроллер или как jsp в WEB-INF.

Может кто-нибудь показать мне, как разрешить аутентифицированным пользователям получать доступ ко всем моим приложениям и отправлять людей с определенной ролью (ROLE_BANNED) на запрещенную страницу?

EDIT Вот вся моя безопасность: http setup:

<security:http auto-config="true" access-denied-page="/denied" entry-point-ref="casAuthenticationEntryPoint" use-expressions="true">
    <security:intercept-url pattern="/**" access="isFullyAuthenticated() and not hasRole('ROLE_BANNED')" requires-channel="https"/>
    <security:intercept-url pattern="/denied" access="IS_AUTHENTICATED_FULLY" filters="none" />

    <security:logout logout-url="/logout" logout-success-url="${cas.logoutUrl}" />
    <security:session-management session-fixation-protection="none" />
    <security:custom-filter after="CAS_FILTER" ref="casAuthenticationFilter"/>
    <security:custom-filter before="CHANNEL_FILTER" ref="channelProcessingFilter" />
    <security:port-mappings>
        <security:port-mapping http="80" https="443" />
    </security:port-mappings>
</security:http>

Я пытался использовать отображенную на контроллере запрещенную страницу (/ denied), страницу jsp (/denied.jsp) и даже простую HTML-страницу (/denied.html), но я получаю 404 за каждую. Когда это происходит, я ничего не вижу в лог-файлах.

Ответы [ 2 ]

4 голосов
/ 16 ноября 2010

Я закончил тем, что сделал следующее:

<security:intercept-url pattern="/**" access="isFullyAuthenticated()" requires-channel="https"/>
<security:intercept-url pattern="/banned" access="isFullyAuthenticated() and hasRole('ROLE_BANNED')" requires-channel="https"/>

Это означает, что вы должны войти в систему в обоих случаях, но вы должны иметь роль BANNED для доступа к запрещенной странице.

Я также добавил аспект, который запускается перед каждым методом контроллера с RequestMethod.GET, который проверяет, есть ли у пользователя роль BANNED, и, если это так, перенаправляет их в /banned.

.

Если кто-нибудь знает лучший способ сделать это, пожалуйста, добавьте ответ.

0 голосов
/ 06 октября 2010

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

Этот пример сSpring Security 2, но он должен переводиться ...

<intercept-url pattern="/denied.html" access="IS_AUTHENTICATED_ANONYMOUSLY" filters="none" />

Редактировать:

Возможно, вам также понадобится, чтобы ваши JavaScript, CSS, изображения и т. Д. Также имели аналогичное исключениеиз ограничений безопасности, иначе ваша страница не загрузит ничего, кроме простого текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...