前面只是简单使用了springsecurity的登录控制功能,当然实际使用中是一定需要写一些自定义配置的;本节将通过springsecurity配置一些功能:
- 通过数据库用户密码完成认证
- 使用自定义登录页面
- 实现记住我功能
- 增加验证码功能
添加配置类
配置的一个比较重要的类是 WebSecurityConfigurerAdapter
新建一个配置类去继承WebSecurityConfigurerAdapter,同时开启 @EnableWebSecurity
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
}
主要做配置的就是实现这3个configure 方法;
1. 默认的AuthenticationManager 默认是获取的,而如果重写后那么将使用AuthenticationManagerBuilder 构建的AuthenticationManager ,此方法也可以用来配置认证用户信息;
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
this.disableLocalConfigureAuthenticationBldr = true;
}
- 重写此方法配给制web安全相关的配置
@Override
public void configure(WebSecurity web) throws Exception {
}
- 重写此方法配置授权和认证相关的接口的信息
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
}
自定义登录时认证信息获取
springsecurity 提供了获取用户信息的一个重要接口 UserDetailsService
在登录的时候会调用此接口的
//返回的信息是 UserDetails类
UserDetails 是用户的抽象信息,包含了用户名,密码,是否过期,是否启用等信息;
UserDetails loadUserByUsername(String username);
UserDetailsService 接口 框架默认也提供了多种实现
其中:
CachingUserDetailsService 通过装饰器模式装饰有缓存功能的service,内部维护了缓存
InMemoryUserDetailsManager 通过内存中获取用户信息的管理器
JdbcUserDetailsManager jdbc 通过jdbcTemplate 获取用户信息
基于内存的实现
使用@Bean声明一个 UserDetailsService 写在配置类中
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withDefaultPasswordEncoder().username("user").password("123456").roles("USER").build());
manager.createUser(User.withDefaultPasswordEncoder().username("admin").password("111111").roles("SYSTEM").build());
return manager;
}
简单看下 InMemoryUserDetailsManager 的实现,其实就是在map 中维护了用户的信息;
在登录的时候从map中获取信息比对;根据上面的配置就可以同时使用2个不同角色的用户执行登录;
查询数据库
-
引入mybatis-plugs 和mysql驱动等相关jar包
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency>
添加数据库驱动配置
# DataSource Config spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT username: root password: 111111
-
实现自定义userdetailservice 及定义一个实现了UserDetails 接口的userdetail信息
public class MyUserDetailService implements UserDetailsService {
@Resource
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User findUser = userMapper.findOneByUserName(username);
return MyUserDetails.create(findUser);
}
}
@TableName(value = "t_user")
public class User {
private Long id;
private String userName;
private String passWord;
private Boolean locked;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public Boolean getLocked()