五、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加密,会自动将用户密码进行加密,再匹配是否一致。

posted @ 2023-06-18 20:48  aesopcmc  阅读(161)  评论(0)    收藏  举报