2012-09-10 2 views
2

Я использую Spring Security 2.x уже некоторое время, но недавно я переключился на 3.x. Я всегда использую собственную реализацию интерфейса UserDetails и аутентификацию против БД.Отсутствует ROLE_ANONYMOUS весной Безопасность

Все работает нормально (вход в систему, выход из системы, фильтры URL, просмотр имени пользователя авторизованного пользователя и т. Д.).

Осталось только показать сообщение «Пожалуйста, войдите», если пользователь не авторизовался. Я пробовал несколько подходов:

<sec:authorize access="not isAnonymous()"> 
or 
<sec:authorize access="hasRole('ROLE_ANONYMOUS')"> 
etc. 

Ни один из них не работал. Наконец, я добавил <sec:authentication property="principal.authorities" /> на выход моей домашней страницы, чтобы отлаживать, какие роли у пользователя действительно есть. Это то, что я вижу:

  • Зарегистрированный пользователь - [ROLE_USER, ROLE_ADMIN]
  • Неразрешенное пользователя - `` < - пустая строка

Похоже, что я каким-то образом потерял власть по умолчанию ROLE_ANONYMOUS, который всегда был добавлен Весна, если я правильно помню. Это что-то недавно упало или что-то еще? Возможно, мне придется позаботиться об этом анонимном доступе каким-то другим способом?

Соответствующая часть контекста безопасности:

<beans:beans 
     xmlns="http://www.springframework.org/schema/security" 
     xmlns:beans="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/security 
      http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

    <!-- UNPROTECTED RESOURCES --> 
    <http pattern="/" security="none"/> 
    <http pattern="/favicon.ico" security="none"/> 
    <http pattern="/home" security="none"/> 
    <http pattern="/login*" security="none"/> 
    <http pattern="/resources/**" security="none"/> 

    <!-- PROTECTED RESOURCES --> 
    <http auto-config='true' use-expressions="true"> 
     <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/> 
     <intercept-url pattern="/admin/**" access="hasRole('ROLE_USER,ROLE_ADMIN')"/> 
     <form-login login-page="/login" default-target-url="/dashboard" authentication-failure-url="/login?login_error=true"/> 
     <logout logout-url="/logout"/> 
    </http> 

    <beans:bean id="userAccountsAuthenticationProvider" class="pl.xxx.utils.UserAccountsAuthenticationProvider" /> 

    <beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource"> 
     <beans:property name="userPropertyToUse" value="salt" /> 
    </beans:bean> 

    <authentication-manager> 
     <authentication-provider user-service-ref="userAccountsAuthenticationProvider"> 
      <password-encoder ref="standardPasswordEncoder"/> 
     </authentication-provider> 
    </authentication-manager> 
</beans:beans> 

ответ

3

анонимной проверки подлинности можно настроить несколькими различными способами - вы используете <http auto-config="true">, <anonymous> тег или определить бобы самостоятельно в качестве пользовательского фильтра? Это будет проще, если вы разместите свой security-context.xml.

Во всяком случае, вы хотите отобразить «Пожалуйста, войдите», так что я предполагаю, что вы действительно хотели

<sec:authorize access="isAnonymous()">Please login</sec:authorize> 

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

Другой способ заключается в использовании isAuthenticated() вместо этого, свести на нет его в EL и посмотреть, если он работает в вашем случае:

<sec:authorize access="isAuthenticated()" var="isAuthenticated" /> 
<c:if test="${not isAuthenticated}"> 
    <!-- do stuff --> 
</c:if> 

EDIT:

Изменение security="none" для access="IS_AUTHENTICATED_ANONYMOUSLY" и переместить выбранные шаблоны для перехвата -url. Это должно позволить фильтр цепи Spring Security и применять AnonymousAuthenticationFilter по запросу:

<!-- UNPROTECTED RESOURCES --> 
<http pattern="/favicon.ico" security="none"/> 
<http pattern="/resources/**" security="none"/> 

<!-- PROTECTED RESOURCES --> 
<http auto-config='true' use-expressions="true"> 
    <intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
    <intercept-url pattern="/home" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
    <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')"/> 
    <intercept-url pattern="/admin/**" access="hasRole('ROLE_USER,ROLE_ADMIN')"/> 
    <form-login login-page="/login" default-target-url="/dashboard" authentication-failure-url="/login?login_error=true"/> 
    <logout logout-url="/logout"/> 
</http> 

если вы хотите использовать isAnonymous() в /, /home и /login*.

Моего предыдущее решение работало, потому что с security="none" проверкой isAuthenticated()всегда дало ложное, так отрицающее это было как проверка не loggged.

+0

Добавлен контекст безопасности. Как вы можете видеть, я использую 'auto-config', но не' 'или пользовательские фильтры.Также '' работает, но ваш пример с параметром 'isAuthenticated' не имеет значения. Странный. –

+0

Моя ошибка - ваше решение с передающим значением 'isAuthenticated()' переменной и проверкой его в 'if' statement работает! Но это еще не ответило на мой вопрос: что случилось с «ROLE_ANONYMOUS»? –

+0

Другими словами: ' ' Этот фрагмент ВСЕГДА показывает мне: 'false '. –

Смежные вопросы