2014-02-17 2 views
2

Я новичок в Spring Security, и я пытаюсь настроить аутентификацию/авторизацию в базе данных PostgreSQL. Я следовал первым трем главам here и без проблем получил имя пользователя/пароль в памяти. После создания таблиц, необходимых для схемы (here), то создание JNDI DataSource в котом (here) вместе со всеми бобами, необходимых для весны, Логин сейчас неудачу с этим сообщением:Весенняя безопасность с проверкой подлинности JDBC - нет аутентификацииПроверка найдена

Ваша попытка Войти был не удалось, повторите попытку.

Причина: Нет AuthenticationProvider найдено org.springframework.security.authentication.UsernamePasswordAuthenticationToken

Вот бобы определены в моем сервлет-context.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd"> 

    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> 
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/TyedArtDB"/> 

    <!-- Enables the Spring MVC @Controller programming model --> 
    <annotation-driven /> 

    <context:component-scan base-package="com.tyedart.web" /> 

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> 
    <resources mapping="/resources/**" location="/resources/" /> 

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> 
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <beans:property name="prefix" value="/WEB-INF/views/" /> 
     <beans:property name="suffix" value=".jsp" /> 
    </beans:bean> 

    <beans:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> 
     <beans:property name="dataSource" ref="dataSource"/> 
    </beans:bean> 

    <beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> 

    <beans:bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
     <beans:property name="userDetailsService" ref="userDetailsService"/> 
     <beans:property name="passwordEncoder" ref="passwordEncoder"/> 
    </beans:bean> 

    <beans:bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager"> 
     <beans:property name="providers"> 
      <beans:list> 
       <beans:ref bean="daoAuthenticationProvider"/> 
      </beans:list> 
     </beans:property> 
    </beans:bean> 

</beans:beans> 

А вот мой SecurityConfig класс:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
//  auth 
//   .inMemoryAuthentication() 
//    .withUser("rob").password("22").roles("ADMIN"); 

     InitialContext ctx = new InitialContext(); 
     DataSource dataSource = (DataSource) ctx.lookup("java:/comp/env/jdbc/TyedArtDB"); 

     auth 
      .jdbcAuthentication() 
       .dataSource(dataSource) 
       .withDefaultSchema() 
       .passwordEncoder(new BCryptPasswordEncoder()); 
    } 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
       .antMatchers("/manage/**").hasRole("ADMIN") 
       .and() 
      .formLogin(); 
    } 
} 

Любые идеи, что я делаю Неправильно?

ответ

3

Я только что настроил Security с JDBC. Я использовал аннотацию java для настройки своего приложения. Несколько вещей, которые я отметил:

.withDefaultSchema() 

Для меня неожиданно. У меня был настроен источник данных, однако я не создал таблицы по умолчанию. Spring подключен к моему источнику данных и автоматически создает схему. Я заметил, что вы создали схему вручную. Этого я и ожидал. Документы, казалось, были неоднозначными, поэтому я просто запускал приложение без создания таблиц. Voila Spring создал таблицы базы данных для меня. Возможно, схема не соответствует (см. Мой следующий раздел, я обнаружил, что документы немного устарели).

Далее, я добавлял Spring Security в небольшое приложение Spring MVC. В блоге Spring содержалась правильная аннотация конфигурации:

@EnableWebMvcSecurity 

Сообщите мне, если вы хотите, чтобы я опубликовал свой конфиг безопасности. Это java не xml. Таким образом, я не знаю, поможет ли это.

+0

Спасибо, эти два предмета - именно то, что мне нужно! У вас возникли проблемы с вводом вашего источника данных? У меня есть еще один пост для этого: http://stackoverflow.com/questions/21826538/spring-jndi-datasource-no-qualifying-bean-of-type-javax-sql-datasource-found –

+0

Рад помочь , Я настроил свой источник данных как часть JPA по Hibernate. Я использую Spring вместо JNDI для доступа к источнику данных. И.Е. источник данных аннотируется с помощью @Bean. У меня есть проект git hub с той же настройкой (минус весенняя безопасность. Вам нужен URL-адрес? – lorinpa

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