设置用户名密码的方式:
- 配置文件
# 设置默认的用户名密码
spring.security.user.name=futao
spring.security.user.password=nobug666.
- 配置类的方式
/**
* @author ft
* @date 2021/5/18
*/
@Configuration
public class UserNamePwdConfig extends WebSecurityConfigurerAdapter {
/**
* 设置登录的用户名密码
*
* @param auth
* @throws Exception
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String password = passwordEncoder.encode("nobug666.");
auth.inMemoryAuthentication()
.withUser("futao")
.password(password)
.roles("admin");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
- 查数据库的方式
@Service
public class UserService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
List<GrantedAuthority> roles = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
return new User("futao", new BCryptPasswordEncoder().encode("nobug666."), roles);
}
}
/**
* 设置登录的用户名密码
*
* @param auth
* @throws Exception
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
// String password = passwordEncoder.encode("nobug666.");
// auth.inMemoryAuthentication()
// .withUser("futao")
// .password(password)
// .roles("admin");
// 配置类的方式设置用户名密码
auth.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
}
# CSRF Cross-site request forgery
,跨站请求伪造
用户在登录站点A之后,保存了站点A的cookie。之后站点B去恶意访问站点A的接口,浏览器会携带上站点A的cookie,就造成了跨站请求伪造。
- SpringSecurity应对跨站请求伪造:过滤器:
CsrfFilter
-
CsrfFilter
过滤器先获取服务器内csrfToken(从cookie/session),如果没有则生成并保存 - 将csrfToken给客户端:
request.setAttribute
- 验证:
- 客户端拿到
request.getAttribute
- 客户端请求站点需要带上csrfToken
- 从header或者parameter中读取actualToken,将该actualToken与csrfToken比较,如果相同则放行。
- 客户端拿到
-
网友评论