官方文档给出了java的自定义配置,可以参考。
要自定义配置,需要自定义配置类,参考文档创建WebSecurityConfig .class
,配置都写这里面。
@Configuration
// mvc项目需要手动加这个注解,Springboot项目在我们引入security时自动加了
//@EnableWebSecurity
public class WebSecurityConfig {
@Bean
UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(
User.withUsername("user")
.password(new BCryptPasswordEncoder().encode("password") )
.roles("USER")
.build());
return manager;
}
}
security自动加
1. 基于内存的用户认证
就像上面的配置一样:
@Configuration
// mvc项目需要手动加这个注解,Springboot项目在我们引入security时自动加了
//@EnableWebSecurity
public class WebSecurityConfig {
/**
* 默认密码加密过时了,说不安全
* 我们换一个安全的
* @return
*/
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
/**
* 基于内存的用户认证
* 注意 有自定义配置后,application.yml文件中配置的账号密码就失效了
*/
@Bean
UserDetailsService userDetailsService() {
// 内存用户管理器
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(
// 创建UserDetails对象,管理账号、密码、角色、权限等
User.withUsername("user")
.password(passwordEncoder().encode("password") )
.roles("USER")
.build());
return manager;
}
}
2. 基于数据源的用户认证
从基于内存的用户可以看出,主要是创建了UserDetailsService对象,注册成Bean,交给Spring,SpringSecurity流程中会使用的。数据库这个和那个是一样的。
大致就是:
- 从数据库拿账号信息,
- 用账号信息创建一个UserDetailsService对象,
- 注册成Bean
2.1 查数据库组对象
我们新建一个MyUserDetailService.class
public class MyUserDetailService implements UserDetailsService {
// @Resource
// private UserDao userDao;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 数据库拿用户信息
// 角色信息
// 权限信息
Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.add(() -> "aut");
return User
.withUsername("ls")
.password(new BCryptPasswordEncoder().encode("ls456"))
.roles("R1", "r2")
.authorities(authorities)
.accountExpired(false)
.accountLocked(false)
.credentialsExpired(false)
.build();
}
}
2.2 注册Bean
在WebSecurityConfig 注册成Bean
@Configuration
// mvc项目需要手动加这个注解,Springboot项目在我们引入security时自动加了
//@EnableWebSecurity
public class WebSecurityConfig {
/**
* 默认密码加密过时了,说不安全
* 我们换一个安全的
* @return
*/
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
/**
* 基于内存的用户认证
* 注意 有自定义配置后,application.yml文件中配置的账号密码就失效了
*/
// @Bean
// UserDetailsService userDetailsService() {
// // 内存用户管理器
// InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
// manager.createUser(
// // 创建UserDetails对象,管理账号、密码、角色、权限等
// User.withUsername("user")
// .password(passwordEncoder().encode("password") )
// .roles("USER")
// .build());
//
// return manager;
// }
/**
* 基于数据源的用户认证
*/
@Bean
UserDetailsService userDetailsService() {
MyUserDetailService userDetail = new MyUserDetailService();
return userDetail;
}
}
重启,就可以用数据库的账号密码访问了。