我是这样使用SpringBoot(Spring Security实现用户登录)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我是这样使用SpringBoot(Spring Security实现用户登录)相关的知识,希望对你有一定的参考价值。
参考技术A 大多数项目是需要安全控制的。这章用Spring Security实现用户登录功能。这章新创建一个模块来开发。 创建模块参考 这里 。模块的ArtifactId为bhuser。
下面先写两个页面,需要在pom.xml文件中引入spring-boot-starter-thymeleaf。文件内容:
既然是安全控制,就需要有控制的点。这里写两个Controller,分别是两个界面。到最后的目标是一个界面不需要登录就可以浏览,一个界面需要用户登录后才能浏览。
在包com.biboheart.demos.controller下创建PageController。内容如下:
在sources/templates中创建两个页面,分别是home.html和hello.html
home.html内容如下:
hello.html内容如下:
启动服务后,访问localhost
点击连接“这里”进入hello页面。
现在是没有权限控制的情况下的结果。下面来增加安全控制,使home页面可以访问,hello页面需要用户登录才能访问。
在pom.xml中引入spring-boot-starter-security组件
这时候启动项目,访问首页就会跳转到登录页面了。
这个登录页面是框架提供的。用户名和密码是框架生成的。这样的用户名密码不可控制。接下增加自己的登录认证业务。
创建包com.biboheart.demos.security,安全控制的业务写在这个包下。创建security配置文件SecurityConfiguration,内容:
注意,Spring Security 5必须配置 passwordEncoder。
重启服务,访问localhost
点击连接“这里”,跳转到了login界面
在 Spring Boot 项目中使用 HikariCP 和 Hibernate 的更好方法
【中文标题】在 Spring Boot 项目中使用 HikariCP 和 Hibernate 的更好方法【英文标题】:Better way to use HikariCP with Hibernate in Spring Boot Project 【发布时间】:2016-05-20 00:01:21 【问题描述】:我是初学者,我有一个简单的 Spring Boot 项目,这是我第一次使用连接池(在本例中为 HikariCP),我需要您的帮助。它正在工作,但我想知道我是否在 Hibernate 中以正确的方式使用它,或者是否有更好的方法,以及我的 Spring Boot 项目结构是否正确。
编辑:即使我删除了 HikariCPConfig
类,它也能正常工作,我怎么知道连接池是否工作?
项目如下:
- BankManager
src/main/java
|
|__com.manager
|__BankManagerApplication.java
|__HikariCPConfig.java
|__com.manager.dao
|__ClientRepository.java
|__com.manager.entities
|__Client.java
|__com.manager.service
|__ClientServiceImpl.java
|__ClientServiceInterface.java
src/main/resources
|__application.properties
BankManagerApplication.java:
@SpringBootApplication
public class BankManagerApplication
public static void main(String[] args)
ApplicationContext ctx = SpringApplication.run(BankManagerApplication.class, args);
ClientServiceInterface service = ctx.getBean(ClientServiceInterface.class);
service.addClient(new Client("client1"));
service.addClient(new Client("client2"));
HikariCPConfig.java:
@Configuration
@ComponentScan
class HikariCPConfig
@Value("$spring.datasource.username")
private String user;
@Value("$spring.datasource.password")
private String password;
@Value("$spring.datasource.url")
private String dataSourceUrl;
@Value("$spring.datasource.dataSourceClassName")
private String dataSourceClassName;
@Value("$spring.datasource.poolName")
private String poolName;
@Value("$spring.datasource.connectionTimeout")
private int connectionTimeout;
@Value("$spring.datasource.maxLifetime")
private int maxLifetime;
@Value("$spring.datasource.maximumPoolSize")
private int maximumPoolSize;
@Value("$spring.datasource.minimumIdle")
private int minimumIdle;
@Value("$spring.datasource.idleTimeout")
private int idleTimeout;
@Bean
public HikariDataSource primaryDataSource()
Properties dsProps = new Properties();
dsProps.put("url", dataSourceUrl);
dsProps.put("user", user);
dsProps.put("password", password);
dsProps.put("prepStmtCacheSize",250);
dsProps.put("prepStmtCacheSqlLimit",2048);
dsProps.put("cachePrepStmts",Boolean.TRUE);
dsProps.put("useServerPrepStmts",Boolean.TRUE);
Properties configProps = new Properties();
configProps.put("dataSourceClassName", dataSourceClassName);
configProps.put("poolName",poolName);
configProps.put("maximumPoolSize",maximumPoolSize);
configProps.put("minimumIdle",minimumIdle);
configProps.put("minimumIdle",minimumIdle);
configProps.put("connectionTimeout", connectionTimeout);
configProps.put("idleTimeout", idleTimeout);
configProps.put("dataSourceProperties", dsProps);
HikariConfig hc = new HikariConfig(configProps);
HikariDataSource ds = new HikariDataSource(hc);
return ds;
ClientServiceImpl.java
@Service
public class ClientServiceImpl implements ClientServiceInterface
@Autowired
ClientRepository clientRepository; // this class extends JPARepository
@Override
public Client addClient(Client c)
return clientRepository.save(c);
application.properties:
server.port = 8888
spring.jpa.databasePlatform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = update
spring.datasource.dataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/bank_manager
spring.datasource.username=root
spring.datasource.password=
spring.datasource.poolName=SpringBootHikariCP
spring.datasource.maximumPoolSize=5
spring.datasource.minimumIdle=3
spring.datasource.maxLifetime=2000000
spring.datasource.connectionTimeout=30000
spring.datasource.idleTimeout=30000
spring.datasource.pool-prepared-statements=true
spring.datasource.max-open-prepared-statements=250
提前谢谢你。
【问题讨论】:
【参考方案1】:你的项目结构是标准的,所以是正确的。
关于光:
Hikari 确实是池化的绝佳选择。我习惯于通过使用您在您的案例中应用的一组较小的参数成功地与 Hikari 合作,但如果它对您有用,那很好。 有关 Hikaru 设置的更多信息,我建议您阅读official wiki,如果您还没有的话。
关于属性加载:
您可以使用一些 SpringBoot 功能来读取 DB 参数并以更少的代码应用到您的运行时 Bean。喜欢:
在 application.properties 中(为您的池参数定义一个自定义前缀“myproject.db”)
myproject.db.dataSourceClassName=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
myproject.db.url=jdbc:mysql://localhost:3306/bank_manager
myproject.db.username=root
... and the other params below
创建一个 Spring 配置类
@Configuration
public class MyDBConfiguration
@Bean(name = "myProjectDataSource")
@ConfigurationProperties(prefix = "myproject.db")
public DataSource dataSource()
//This will activate Hikari to create a new DataSource instance with all parameters you defined with 'myproject.db'
return DataSourceBuilder.create().build();
在您的 ClientRepository 类中:
@Repository
public class ClientRepository
//The code below is optional, but will work if you want to use jdbctemplate tied to the DataSource created above. By default all Hibernate Sessions will take the DataSource generated by Spring
@Bean(name = "myProjectJdbcTemplate")
public JdbcTemplate jdbcTemplate(@Qualifier("myProjectDataSource") DataSource dataSource)
return new JdbcTemplate(dataSource);
如果您要使用 2 个或更多不同的数据库,还有其他选项可以管理 DataSource bean 创建。您可以更改其他数据库的属性前缀并将 1 个数据源仅注释为 @Primary,当您在 Spring 上下文中拥有超过 1 个数据源时,这是强制性的
【讨论】:
谢谢,帮了大忙。以上是关于我是这样使用SpringBoot(Spring Security实现用户登录)的主要内容,如果未能解决你的问题,请参考以下文章