五、spring security【配置用户认证、crsf、rememberMe】
配置csrf、rememberMe
@Configuration
@EnableWebSecurity(debug = true) // 开启调试模式,生产环境不要使用
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((req) -> req
// 需要认证才能访问的URL
// .antMatchers("/api/**").authenticated()
// 需要认证并拥有ADMIN角色才能访问的URL
.antMatchers("/api/say2").hasRole("ADMIN")
// 放行不需要认证的URL
.antMatchers("/webjars/**", "/error").permitAll()
// 放行通用的css、js等静态资源位置
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
// 除了以上规则,默认拦截所有URL请求,要求认证后才能访问(该语句必须要放在末尾)
.anyRequest().authenticated()
)
.formLogin(form-> form
// 定义登陆页面
.loginPage("/login").permitAll()
// 登录成功后跳转的页面
.defaultSuccessUrl("/"))
// 配置退出登录的路径,配置后使用POST请求。若不配置,默认为/logout,退出成功跳到/login
.logout(logout-> logout.logoutUrl("/perform_logout").logoutSuccessUrl("/login"))
.httpBasic(Customizer.withDefaults())
// 开启CSRF ,并配置不需要CSRF的路径
.csrf(csrf->csrf.ignoringAntMatchers("/api/**"))
// .csrf()
// 禁用csrf
// .csrf().disable()
.rememberMe(Customizer.withDefaults());
// ...
return http.build();
}
}
- CSRF。
开启.csrf()
开启后,前端的配置如下:
前端页面获取csrf_token值默认为${_csrf.parameterName},${_csrf.token}:
<input
type="hidden"
id="csrf_token"
th:name="${_csrf.parameterName}"
th:value="${_csrf.token}"
/>
- 开启记住我
.rememberMe(Customizer.withDefaults());
前端。表单名称默认为remember-me,可在配置中自定义
<input
type="checkbox"
class="form-check-input"
id="remember-me"
name="remember-me"
/>
<label class="form-check-label" for="remember-me" th:text="#{login.page.form.remember-me}">Remember Me:</label>
添加用户认证
基于内存的认证,springboot 版本2.7.x
@Configuration
@EnableWebSecurity(debug = true) // 开启调试模式,生产环境不要使用
public class SecurityConfig {
/**
* 设定认证方式 Authentication
* 代替了配置
* spring.security.user.name=user
* spring.security.user.password=12345
* spring.security.user.roles=ADMIN,USER
*
* 基于spring boot 2.7 后新的认证方式:
* https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter
*/
/**
* 基于内存的认证 InMemoryUserDetailsManager
*/
@Bean
public InMemoryUserDetailsManager userDetailsService() {
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder().encode("123456"))
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
配置好后,用户可以在登录页输入:user / 123456 进行登录,基于BCryptPasswordEncoder加密,会自动将用户密码进行加密,再匹配是否一致。

浙公网安备 33010602011771号