2015-03-05 3 views
1

Я пытаюсь создать приложение Spring Boot с использованием Spring Security. Я привел следующий пример от http://spring.io/guides/gs/securing-web/. Они используют «Аутентификацию в памяти». Я хочу сделать то же самое, но использовать JDBC-Authentification.Spring Security с JDBC Только для комментариев

Вот мой WebSecurityConfig класс:

package hello; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity; 

@Configuration 
@EnableWebMvcSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
       .antMatchers("/", "/home").permitAll() 
       .anyRequest().authenticated() 
       .and() 
      .formLogin() 
       .loginPage("/login") 
       .permitAll() 
       .and() 
      .logout() 
       .permitAll(); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 

     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
     dataSource.setUrl("jdbc:mysql://localhost:3306/test"); 
     dataSource.setUsername("root"); 
     dataSource.setPassword("root"); 

     auth 
      .jdbcAuthentication().dataSource(dataSource) 
       .usersByUsernameQuery("select * from users where username=?") 
       .authoritiesByUsernameQuery("select * from user_roles where username=?"); 
    } 
} 

Я также создать базу данных MySQL "тест" и две таблицы "пользователей" и "user_roles". Когда я запускаю приложение и пытаюсь войти в систему, я не получаю никаких Исключений, но приложение каким-то образом не может найти пользователя.

Может кто-нибудь мне помочь? Что я делаю не так?

Войти Страница:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" 
     xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"> 
    <head> 
     <title>Spring Security Example </title> 
    </head> 
    <body> 
     <div th:if="${param.error}"> 
      Invalid username and password. 
     </div> 
     <div th:if="${param.logout}"> 
      You have been logged out. 
     </div> 
     <form th:action="@{/login}" method="post"> 
      <div><label> User Name : <input type="text" name="username"/> </label></div> 
      <div><label> Password: <input type="password" name="password"/> </label></div> 
      <div><input type="submit" value="Sign In"/></div> 
     </form> 
    </body> 
</html> 

pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>org.springframework</groupId> 
    <artifactId>gs-securing-web</artifactId> 
    <version>0.1.0</version> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.2.2.RELEASE</version> 
    </parent> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-thymeleaf</artifactId> 
     </dependency> 
     <!-- tag::security[] --> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-security</artifactId> 
     </dependency> 
     <!-- end::security[] --> 

     <!-- JDBC --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
      <version>3.2.8.RELEASE</version> 
     </dependency> 

     <!-- MySQL --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
     </dependency> 
    </dependencies> 


    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

</project> 
+0

Для начала ваши запросы неверны: один для пользователей должен вернуть 3 столбца (имя пользователя, пароль и включено), а другое - для полномочий 2 (имя пользователя, роль). Теперь он возвращает все, что вы там вложили. Также почему у вас есть весна-jdbc версия 3.2.8 в ваших зависимостях? Теперь вы смешаете весеннюю версию, просто добавьте 'spring-boot-starter-jdbc', чтобы получить необходимую вам зависимость (или, по крайней мере, удалить тег версии). –

ответ

0

Рекомендуется, чтобы ваша Datasource решается как отделенная Bean вместо его экземпляр в методе configureGlobal:

@Bean 
public DataSource dataSource() { 
    // create and return a new JDBC DataSource ... 
} 

Вы можете использовать Боб, как вы сделали в вашем методе configureGlobal:

auth.jdbcAuthentication().dataSource(dataSource) 
+0

Что такое, например, ваша Stacktrace. Говорить? –

1

Ваш пользователь должен иметь по крайней мере одна роль, отводимая. Если у пользователя нет роли, аутентификация завершается неудачно (даже если вы хотите иметь возможность входа в систему без каких-либо определенных ролей). Также убедитесь, что флаг пользователя enabled прав.

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