質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Java

    15340questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Spring

    805questions

    Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

springsecurityでのDBの認証について

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,588

heavyuseman

score 34

いつもお世話になっております。
springsecurityでのDBの認証情報で質問があります。
springsecurityでのDBの認証情報を管理する機能を実装したのですが、DataSource
の箇所で下記のエラーが出ます。
2017-05-28 10:11:42.697  WARN 796 --- [           main] o.s.boot.SpringApplication               : Error handling failed (Error creating bean with name 'delegatingApplicationListener' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' available)
2017-05-28 10:11:42.921 ERROR 796 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 


APPLICATION FAILED TO START


Description:

Field dataSource in com.tuyano.springboot.springsecurity.SecurityConfig required a bean of type 'javax.sql.DataSource' that could not be found.

  • Bean method 'dataSource' not loaded because @ConditionalOnProperty (spring.datasource.type) did not find property 'spring.datasource.type'
  • Bean method 'dataSource' not loaded because @ConditionalOnProperty (spring.datasource.jndi-name) did not find property 'jndi-name'
  • Bean method 'dataSource' not loaded because @ConditionalOnBean (types: org.springframework.boot.jta.XADataSourceWrapper; SearchStrategy: all) did not find any beans

Action:

Consider revisiting the conditions above or defining a bean of type 'javax.sql.DataSource' in your configuration.

DBはMysqlを使用し、データソースがはApache Commons DBCPを使用しています。
JavaConfigでデータソースを定義しています。
上記のエラーの原因はDBをMysqlに設定しているため、データソースをMysql用のものを
設定していないことが原因なのでしょうか?
※ググったのですが、Mysql用のデータソースについての情報がなかったため
困惑しております。
それとも他の原因がありますでしょうか?
以上です。ご回答宜しくお願い致します。

//Apache Commons DBCPのjavaconfig
package com.tuyano.springboot.springsecurity;

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;


import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;

@Configuration
@PropertySource("application.properties")
public class DataSourceConfig {

    @Value("${spring.datasource.driverClassName}")
    private String driverName;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String userName;
    @Value("${spring.datasource.password}")
    private String password;

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfig() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public DataSource dataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(driverName);
        ds.setUrl(url);
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }

}
package com.tuyano.springboot.springsecurity;

import org.springframework.context.annotation.Bean;
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.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;



@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
    @Qualifier("authDataSource")
    @Autowired
    private DataSource dataSource;
    @Override
    protected void configure(HttpSecurity http)  throws Exception{
    http
    .authorizeRequests()
    .antMatchers("/First.html").permitAll()
    .and()
    .formLogin()
    .loginPage("/First.html")
    .loginProcessingUrl("/pricessLogin")
    .defaultSuccessUrl("/Member.html")
    .failureUrl("/user.html")
    .usernameParameter("name")
    .passwordParameter("password")
    .and()
    .csrf()
    .disable();

    }
    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.jdbcAuthentication()
                .dataSource(dataSource)
                .usersByUsernameQuery(
                        "select name, password from Newaccount where name = ?")
                .passwordEncoder(new BCryptPasswordEncoder());
                //.authoritiesByUsernameQuery(
                  //      "select mail_address, role from accounts where mail_address = ?");
    }


}
//Mysql用の設定ファイル
spring.jpa.database=MYSQL
spring.datasource.url=jdbc:mysql://localhost/mysql?useSSL=false
spring.datasource.name=authDataSource
spring.datasource.username=root
spring.datasource.password=root 
spring.datasource.sqlScriptEncoding=UTF-8
spring.datasource.driverClassName=com.mysql.jdbc.Driver
security.user.role=USER,ADMIN
security.basic.enabled=false
buildscript {
    ext {
        springBootVersion = '1.5.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'

war {
    baseName = 'MybootApp'
    version = '0.0.1-SNAPSHOT'
}

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

configurations {
    providedRuntime
}

dependencies {
    //SpringSecurityを使うため、追加
    compile('org.springframework.boot:spring-boot-starter-security')
    compile('org.thymeleaf.extras:thymeleaf-extras-springsecurity4')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-web')
    runtime('mysql:mysql-connector-java')
    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    // MySQL
    //compile ("mysql:mysql-connector-java:$mySQLVersion")
    //追記したMysqlのデータソース用
    compile ('mysql:mysql-connector-java')
    compile ('com.fasterxml.jackson.core:jackson-databind:2.8.8')
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile 'commons-dbcp:commons-dbcp:1.4'  

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

public class SecurityConfig extends WebSecurityConfigurerAdapter{
    @Autowired
    @Qualifier("authDataSource")
    private DataSource dataSource;
.....


と、データソース名にauthDataSourceを指定していますので、

spring.datasource.name=authDataSource


を追加すればよいかと思います。

※ただし、認証用のデータソースと、アプリケーション内で使うデータソースを分けたい場合は、複数のデータソース定義ができるよう、xmlかJavaConfigでやるべきでしょうか。

Mkyong.com | Spring Security form login using database

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/28 10:48 編集

    ご回答ありがとうございます。データソースをjavaconfigに設定したところ新たなエラーが発生しました。
    今の所考えられる原因がDBをMysqlを使用しているにも関わらず、データソースをApache Commons DBCPを使用していることが原因なのではないかを考えております。
    DBとデータソースの製品が違っていても大丈夫なのでしょうか?
    データソースもMysql用のものを使用したいのですが、ネットで検索しても情報が出てこないため困惑しております。
    質問欄に新たにApache Commons DBCPのjavaconfigのソースを追記しました
    以上です。ご回答宜しくお願い致します

    キャンセル

  • 2017/05/28 11:21

    https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html の spring.datasource.type は、基本的にはクラスパスから自動認識されます。そのため、gradleの compile 'commons-dbcp:commons-dbcp:1.4' を設定しているので、Commons-dbcpを使うように動いているかと。mysqlを利用した設定については、Spring公式のページ(https://spring.io/guides/gs/accessing-data-mysql/)から、▼Build with Gradle にて記載されていますよう、dependencies に compile 'mysql:mysql-connector-java' を追加すれば利用されるかと思います。

    キャンセル

  • 2017/05/28 13:23 編集

    mysql:mysql-connector-java-5.1.40.jarを追加したのですが、mysql:mysql-connector-java-5.1.40.jarの中にあるどのクラスをimportすれば、データソースに関連するメソッド等を利用できるようになるのか不明です。
    ※すみませんmysql:mysql-connector-java-5.1.40.jarに関してググったのですが関連する情報が見つからなかったもので...
    gradleのソースを編集しました。
    以上です。ご回答宜しくお願い致します

    キャンセル

同じタグがついた質問を見る

  • Java

    15340questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Spring

    805questions

    Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。