设置用户名密码的方式:
- 配置文件
# 设置默认的用户名密码 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比较,如果相同则放行。