Spring-Security 使用 spring-boot 和 JDBC 身份验证
假设你想要阻止未经授权的用户访问该页面,那么你必须通过授权访问来阻止他们。我们可以通过使用 spring-security 来实现这一点,spring-security 通过保护所有 HTTP 端点来提供基本身份验证。为此,你需要为项目添加 spring-security 依赖项,在 maven 中我们可以将依赖项添加为:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
这是一个安全配置,可确保只有经过身份验证的用户才能访问。
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
DataSource datasource;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.fullyAuthenticated()
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login?logout")
.permitAll()
.and()
.csrf();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(datasource).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
}
组态 | 描述 |
---|---|
@Configuration |
表示 Spring IoC 容器可以将该类用作 bean 定义的源。 |
@Order (SecurityProperties.ACCESS_OVERRIDE_ORDER) |
覆盖访问规则而不更改任何其他自动配置的功能。较低的值具有较高的优先级 |
WebSecurityConfigurerAdapter |
SecurityConfig 类扩展并覆盖其几个方法来设置安全配置的一些细节。 |
@Autowired of DataSource |
提供工厂以连接到物理数据源。 |
configure(HttpSecurity) |
重写方法定义应该保护哪些 URL 路径,哪些不应该保护。 |
.authorizeRequests() .anyRequest() .fullyAuthenticated() |
表示要对我们的应用程序的所有请求进行身份验证。 |
.formLogin() |
配置基于表单的登录 |
.loginPage("/login").failureUrl("/login?error").permitAll() |
指定登录页面的位置,并允许所有用户访问该页面。 |
.logout().logoutUrl("/logout") .logoutSuccessUrl("/login?logout").permitAll() |
注销后重定向到的 URL。默认为/ login?logout。 |
.csrf() |
用于防止跨站点请求伪造,启用 CSRF 保护(默认)。 |
configure(AuthenticationManagerBuilder){} |
重写方法,用于定义用户的身份验证方式。 |
.jdbcAuthentication().dataSource(datasource) |
表示我们正在使用 JDBC 身份验证 |
.passwordEncoder(passwordEncoder()) |
表示我们正在使用密码编码器来编码我们的密码。 (创建一个 bean 来返回密码 Encoder 的选择,我们在这种情况下使用 BCrypt) |
请注意,我们尚未配置任何要使用的表名或任何查询,这是因为默认情况下 spring security 会查找下表:
create table users (
username varchar(50) not null primary key,
password varchar(255) not null,
enabled boolean not null) ;
create table authorities (
username varchar(50) not null,
authority varchar(50) not null,
foreign key (username) references users (username),
unique index authorities_idx_1 (username, authority));
将以下行插入上表:
INSERT INTO authorities(username,authority)
VALUES ('user', 'ROLE_ADMIN');
INSERT INTO users(username,password,enabled)
VALUES('user', '$2a$10$JvqOtJaDys0yoXPX9w47YOqu9wZr/PkN1dJqjG9HHAzMyu9EV1R4m', '1');
在我们的例子中,用户名是 user
,密码也是用 BCrypt 算法加密的 user
最后,在 application.properties 中配置数据源以使用 spring boot:
spring.datasource.url = jdbc:mysql://localhost:3306/spring
spring.datasource.username = root
spring.datasource.password = Welcome123
注意: 创建并配置登录控制器并将其映射到路径/login
,并将登录页面指向此控制器