Почему мой Spring Security Voter вызывается только при входе в систему, а не при каждом доступе к странице? - PullRequest
1 голос
/ 17 августа 2011

Я успешно создал собственный класс AccessDecisionVoter и связал его с моим веб-приложением через XML.

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

Как мне заставить его вызываться на каждой странице?

<security:http auto-config="true" 
               use-expressions="true" 
               access-decision-manager-ref="accessDecisionManager">
    <security:intercept-url pattern="/login" access="permitAll" />
    <security:intercept-url pattern="/statics/*" access="permitAll" />

    <security:form-login login-page="/login"
                         authentication-failure-url="/login?error=true"
                         default-target-url="/index" />

    <security:logout invalidate-session="true"
                     logout-success-url="/loggedout"
                     logout-url="/logout" />
</security:http>
<bean id="accessDecisionManager"
      class="org.springframework.security.access.vote.UnanimousBased">
    <property name="decisionVoters">
        <list>
            <bean class="com.tarigma.gem.security.DBVoter" />
        </list>
    </property>
</bean>

Ответы [ 2 ]

0 голосов
/ 17 августа 2011

У вас есть две опции, которые в значительной степени зависят от желаемого поведения.

  1. Если вы хотите, чтобы проверка выполнялась каждый раз, когда пользователь заходит на какую-либо страницу, вам нужно создать пользовательскуюфильтр и проверять с вашим избирателем на каждый запрос.Предположительно, вам понадобится некоторая логика, чтобы сделать это, только если пользователь уже вошел в систему и т. Д. И должен будет предпринять соответствующие действия (перенаправление пользователя и т. Д.).Вы должны быть осторожны с бесконечными циклами и / или заставить фильтр применяться только к определенным путям (например, вы, очевидно, не защитите форму входа в систему таким образом).
  2. Вы можете использовать библиотеку тегов Spring Security - если вы используете JSP для своих представлений - для защиты каждой страницы, которая вас интересует, с помощью тега authorize в библиотеке тегов и проверки с помощьюроль (или любую строку, которую вы определили), за которую ваш избиратель может голосовать.

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

Надеюсь, это поможет!

0 голосов
/ 17 августа 2011

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

Вы настроили Spring в соответствии с запросом проверки. Поместите этот фильтр первым в цепочке. В большинстве случаев, помните меня, отвергает это. Посмотрите, какие ресурсы настроены для проверки. Вы должны настроить, под каким Uris вы выполняете защиту.

<security:intercept-url pattern="/**" access="permitAll" />

Вы используете аннотации?

<global-method-security secured-annotations="enabled" access-decision-manager-ref="accessDecisionManager"/>

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