Spring Boot,与数据库链接的 Spring 安全性

Posted

技术标签:

【中文标题】Spring Boot,与数据库链接的 Spring 安全性【英文标题】:Spring Boot, Spring security linked with database 【发布时间】:2017-05-16 17:43:32 【问题描述】:

抱歉我的英语不好..

我是 Spring 的初学者。一位同事建议我使用 Spring boot 开始。目前我喜欢这样。

首先,我想创建一个与 mysql 数据库链接的身份验证/登录模块。

我正在研究 IntelliJ 和 phpMyAdmin。

这项工作有 3 个部分: - 认证系统 - OK - 数据库链接和基本操作 - OK - 身份验证和数据库之间的链接 - 不正常。

目前,对于身份验证,我有这个文件:

WebSecurityConfig.java

package hello;

//imports


@Configuration
@EnableWebSecurity
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 
    auth
            .inMemoryAuthentication()
            .withUser("user").password("password").roles("USER");


要将我的应用程序与数据库连接,我有这个文件:

application.properties

spring.datasource.url = jdbc:mysql://localhost/simulateur
spring.datasource.username =  root
spring.datasource.password =

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager)

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

我喜欢这个解决方案,因为它是使用 Play Framework 的记住我的解决方案,也是我企业的解决方案。我希望保留这个文件:application.properties。一个配置文件看起来很棒。

为了链接所有这些,我在 website 上找到了解决方案。 我必须在我的 WebSecurityConfig.java 中添加这个:

@Autowired
DataSource dataSource;

@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception 

  auth.jdbcAuthentication().dataSource(dataSource)
.usersByUsernameQuery(
 "select username,password, enabled from users where username=?")
.authoritiesByUsernameQuery(
 "select username, role from user_roles where username=?");
  

并将其添加到文件 MvcConfig.java 中,并带有正确参数的路由和其他功能:

@Bean(name = "dataSource")
 public DriverManagerDataSource dataSource() 
 DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
 driverManagerDataSource.setDriverClassName("com.mysql.jdbc.Driver");
 driverManagerDataSource.setUrl("jdbc:mysql://localhost/simulateur");
 driverManagerDataSource.setUsername("root");
 driverManagerDataSource.setPassword("");
 return driverManagerDataSource;
 

我的问题是我有重新定义数据库连接的印象。我想使用我的文件:application.properties。 你有想法使用这个文件而不使用 MvcConfig.java 中的代码部分吗?

提前感谢您的帮助! :)

【问题讨论】:

您正在创建一个数据源 bean,如果您同时使用多个数据源,例如 Mysql 和 Oracle,这将非常有用。如果我正确理解了您的问题,那么您只使用一个数据源,因此您可以在没有 MyConfig.java 类的情况下实现这一目标。当您在 application.properties 中指定数据源参数时,springboot 会创建一个 bean 供您使用。您需要做的就是自动装配 JdbcTemplate 对象.. 你已经完全理解了我的问题。我想在我的 application.properties 中定义我的数据源参数,但现在,我该如何使用它?我没有在网上找到没有 MyConfig.java 的实现示例.. 试试这个***.com/questions/27697190/… 【参考方案1】:

在 Spring Boot 中,您有两种定义数据源的方法,要么在 application.properties 上定义它,要么以编程方式进行。除非您需要一些非常具体的配置,或者您有多个数据源,否则您应该在 application.properties 中定义您的数据源配置,以便 springboot 为您自动配置所有内容。

在您提供的示例中,您定义了两次数据源,您应该删除 MvcConfig.java。

我建议你阅读这篇关于如何使用sql数据库和spring bootWorking with SQL databases的文章

【讨论】:

非常感谢您的帮助。但是如果我删除 MvcConfig.java 中的代码,我的应用程序将如何理解 WebSecurityConfig.java 中添加的代码? Springboot 应该使用您在 application.properties 中提供的配置实例化一个数据源。您的 WebSecurityConfig 应该可以正常工作。 我刚刚检查了您的 application.properties 配置。确保您提供了 spring 配置数据源所需的所有信息。至少,您需要定义以下属性:spring.datasource.url、spring.datasource.username、spring.datasource.password、spring.datasource.driver-class-name【参考方案2】:
server.port = 8084  
#create  and drop tables and sequences, loads import.sql
spring.jpa.hibernate.ddl-auto=update

# MySQL settings
#spring.datasource.url=jdbc:Mysql://localhost:3306/simplehr
spring.datasource.url=jdbc:mysql://localhost:3306/myProject
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.show-sql=true
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# HikariCP settings
 spring.datasource.hikari.*

spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.maximum-pool-size=5

# logging
logging.pattern.console=%dyyyy-MM-dd HH:mm:ss %-5level %logger36 - 
%msg%n
logging.level.org.hibernate.SQL=debug
#logging.level.org.hibernate.type.descriptor.sql=trace
logging.level.=error

spring.mvc.view.prefix:/WEB-INF/jsp/
spring.mvc.view.suffix:.jsp

【讨论】:

以上是关于Spring Boot,与数据库链接的 Spring 安全性的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot实战之MyBatis、Druid

Spring Boot + 安全 + 多 HTTP Web 配置

让 oauth2 与 spring-boot 和 rest 一起工作

Spring Boot,与数据库链接的 Spring 安全性

Spring Boot 与 nodejs websocket 通信

spring-boot+mybatis整合简写