我尝试配置spring-boot-security以与我的SQL架构集成:
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username VARCHAR(20) UNIQUE NOT NULL,
password VARCHAR(20) UNIQUE NOT NULL,
role INTEGER NOT NULL,
FOREIGN KEY (role) REFERENCES user_role (id)
);
CREATE TABLE IF NOT EXISTS user_role (
id SERIAL PRIMARY KEY,
role VARCHAR(10)
);
我找到了许多带有spring-boot-security的集成数据库的例子以及所有这些例子:
@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=?");
}
我不了解如何使用方法usersByUsernameQuery
和authoritiesByUsernameQuery
。为何所有人都选择username
? password
的位置?密码不需要身份验证?
请向我解释这项工作如何。
如何使用configAuthentication()
将我的数据库连接到安全性?
答案 0 :(得分:4)
根据您的方法,您必须进行一些更改才能成功运行usersByUsernameQuery
和authoritiesByUsernameQuery
中的查询。
例如:usersByUsernameQuery
根据您的表格定义应为select username,password,true from users where username=?
,因为您的用户表上没有启用启用。
和authoritiesByUsernameQuery
应该是select u.username, r.role from users u inner join user_roles r on (r.id=u.role) where u.username=?
,因为一个表包含用户信息,另一个表是您应该在查询中使用联接的角色。
Spring认证允许您配置许多方法来实现您的认证方法,在这种情况下,您提出的问题是jdbc认证方法。
当您使用jdbc身份验证时,需要检查以下内容:
确保pom.xml
具有jdbc依赖关系和数据库依赖关系,此示例适用于h2数据库
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
定义数据源bean,让spring boot知道如何连接数据库
DataSource Bean
@Bean(name = "dataSource")
public DriverManagerDataSource dataSource() {
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName("org.h2.Driver");
driverManagerDataSource.setUrl("jdbc:h2:~/test2");
return driverManagerDataSource;
}
WebSecurityConfigurerAdapter
的类,以便将DataSource
bean注入你的AuthenticationManager
构建器,这里是Spring Authentication与你的数据库绑定以便执行的地方查询以检索您已在数据库上创建的用户和角色数据。例如:
public class MySecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
DataSource dataSource;
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
最后auth.jdbcAuthentication().dataSource(dataSource)
设置数据源以查询用户和角色。
/ login servlet身份验证的前端连接
首先创建将使用/login
servlet
<!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>
注册登录视图
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("login");
}
}
希望有所帮助。