Spring Security - Пользовательский поставщик аутентификации не вызывается

У меня есть приложение Spring (версия Spring 2.5.6.SEC01, версия Spring Security 2.0.5) со следующей настройкой (основано на этот вопрос):

В файле security-config.xml у меня есть следующая конфигурация:

<http>
  <!-- Restrict URLs based on role -->
  <intercept-url pattern="/WEB-INF/jsp/login.jsp*" access="ROLE_ANONYMOUS" />
  <intercept-url pattern="/WEB-INF/jsp/header.jsp*" access="ROLE_ANONYMOUS" />
  <intercept-url pattern="/WEB-INF/jsp/footer.jsp*" access="ROLE_ANONYMOUS" />
  <intercept-url pattern="/login*" access="ROLE_ANONYMOUS" />
  <intercept-url pattern="/index.jsp" access="ROLE_ANONYMOUS" />
  <intercept-url pattern="/logoutSuccess*" access="ROLE_ANONYMOUS" />

  <intercept-url pattern="/css/**" filters="none" />
  <intercept-url pattern="/images/**" filters="none" />
  <intercept-url pattern="/**" access="ROLE_ANONYMOUS" />
  <anonymous />
  <form-login login-page="/login.jsp"/>
</http>

<beans:bean id="myUserDetailsService" class="com.example.login.MyUserDetailsService">
  <beans:property name="dataSource" ref="dataSource" />
  <custom-authentication-provider />
</beans:bean>

<authentication-provider user-service-ref="myUserDetailsService" />

Определен класс com.example.login.MyUserDetailsService:

public class MyUserDetailsService extends SimpleJdbcDaoSupport implements UserDetailsService {
  @Override
  public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException,
          DataAccessException {
    logger.info("MyUserDetailsService.loadUserByUsername: Entered method. Username [" + userName + "]");
    ...
  }
}

Но я не вижу эту строку журнала. Как определить пользовательскую службу UserDetailsService, чтобы установить роли безопасности? Мне даже не нужен пользовательский сервис, но наличие его в файле security-config.xml

<authentication-provider> <jdbc-user-service data-source-ref="dataSource" />
</authentication-provider>

не устанавливал роль, хотя у меня есть таблицы пользователей и полномочий. Как я могу установить роли безопасности Spring?


person Tai Squared    schedule 08.01.2010    source источник
comment
Примечание. <custom-authentication-provider> устарело.   -  person C. Ross    schedule 15.08.2011


Ответы (2)


Просто удалите элемент <custom-authentication-provider>.

Ваш MyUserDetailsService НЕ ЯВЛЯЕТСЯ пользовательским AuthenticationProvider. На самом деле вы пытаетесь поставить DaoAuthenticationProvider по умолчанию с пользовательским UserDetailsService. Вот пример рабочего конфига для этого сценария (и еще раз рекомендую использовать auto-config):

<http auto-config = "true">
    <intercept-url pattern="/login.jsp" access="ROLE_ANONYMOUS" />
    ...
    <intercept-url pattern="/**" access="ROLE_USER" />

    <form-login login-page="/login.jsp" default-target-url="/XXX.html" />
</http>

<authentication-provider user-service-ref = "userDetailsService" />

<beans:bean id = "userDetailsService" class = "com.example.MyUserService" />

ИЗМЕНИТЬ:

веб.xml:

...
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
...

логин.jsp:

...
<form method = "POST" action = "<c:url value = "/j_spring_security_check" />">
    <table>
        <tr>
            <td class = "label">Login:</td>
            <td><input type = "text" name = "j_username" /></td>
        </tr>
        <tr>
            <td class = "label">Password:</td>
            <td><input type = "password" name = "j_password" /></td>
        </tr>

        <tr>
            <td colspan = "2"><input type = "submit" value = "Log in" /></td>
        </tr>
    </table>
</form>
...
person axtavt    schedule 08.01.2010
comment
Это имеет тот же результат - я ничего не вижу в MyUserService, независимо от того, верна ли автоконфигурация или нет, или присутствует ‹custom-authentication-provider› или нет. - person Tai Squared; 09.01.2010
comment
Образец, который я разместил, отлично работает для меня. loadUserByUsername() вызывается, когда пользователь нажимает кнопку отправки в форме входа. - person axtavt; 09.01.2010
comment
Есть ли что-то еще в вашей конфигурации или классе Java, которое отличается? У меня есть XML-файл безопасности точно так же, как у вас выше, и MyUserService не вызывается. - person Tai Squared; 09.01.2010
comment
Глядя на forum.springsource.org/showthread.php?t=65079 ( сообщение 6), в нем упоминается, что если поставщик услуг клиента обрабатывает аутентификацию, другие не будут опрошены. У меня нет специального поставщика аутентификации (поскольку я удалил этот тег, но он не попадает в мою службу. Как ваша форма входа настроена в сервлете xml и jsp? Повлияет ли это на вызов моего UserDetailsService или нет? - person Tai Squared; 09.01.2010
comment
Вы проверили свой журнал? Когда в UserService указан ‹custom-authentication-provider /›, в журнале появляется исключение. Если вы пропустили это, вы можете пропустить некоторые другие проблемы с конфигурацией. - person axtavt; 09.01.2010

Я думаю, что тег аутентификации должен сопровождаться тегом менеджера аутентификации.

<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="myUserService" />
</authentication-manager>

Надеюсь, это сработает!

person Balasubramanian Jayaraman    schedule 22.11.2012