Spring Security6.x快速入门——用户认证模块

系列文章目录

Spring Security6.x认证模块核心——AuthenticationProvider解析

Spring Security6.x认证架构解析


目录

前言

一、如何快速入门?

二、准备环境

三、入门说明

四、入门步骤

1.SecurityConfig

2.自定义Filter

五、测试

总结



前言

        拳拳到肉,尽可能地通俗易懂。


一、如何快速入门?

        Spring Security是基于过滤器进行设计的,它自身是一个SecurityFilterChain,在spring官网中,有很长的一个篇幅,对其架构进行介绍;而在这里,我推荐的入门方式是:可以将其快速地浏览一遍,心中只需要留下印象的是——Spring Security和过滤器链,你甚至直接可以将Spring Security看作是"一堆过滤器",这些过滤器组成了"过滤器链",而过滤器链中最重要的一个过滤器是:AuthorizationFilter。

二、准备环境

        本演示使用的是:JDK 17 + Spring Security 6.2.1,maven依赖如下所示:

        核心依赖,即红框框内所示。

        Spring Security的最新版本是6.x,官网6.x演示搭配的是JDK 17,个人尝试了用JDK 8,运行项目时发现存在依赖问题,瞧了官网后便不再深究,直接切换JDK 17。虽然JDK 8是一个里程碑版本,但是JDK 17有替换8的可能。

三、入门说明

        使用spring-initializer初始化一个spring boot项目,导入maven依赖,并添加下述两个源文件,启动项目进行初体验。

        初体验目标:

                1.理解SecurityConfig结构;

                2.自定义Filter中需要加入什么逻辑;

                3.SecurityConfig和自定义Filter如何搭配使用;

                4.如何完成认证测试,认证成功和不成功分别是怎么样的;

四、入门步骤

1.SecurityConfig

代码如下(注释重要):

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    private AuthenticationManager authenticationManager;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        System.out.println(">>>>>>>>>>  进入securityFilterChain");

        http
                .authorizeHttpRequests((authorize) -> authorize
                        .requestMatchers("/login/**").permitAll()
                        .anyRequest().authenticated()
                // 禁用csrf,公司中会使用Token方案,不太会用到csrf,禁用即可
                ).csrf(AbstractHttpConfigurer::disable)
                // 在认证核心AuthorizationFilter执行之前,加入自定义Filter
                // 自定义Filter需要完成的事情:装配Authentication对象,以便AuthorizationFilter执行时可以拿到
                .addFilterBefore(new AuthenticationTokenFilter(authenticationManager), AuthorizationFilter.class);

        return http.build();
    }

    @Bean
    public AuthenticationManager authenticationManager(
            UserDetailsService userDetailsService,
            PasswordEncoder passwordEncoder
    ) {
        DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
        // 认证逻辑的提供者,设置UserDetailsService
        daoAuthenticationProvider.setUserDetailsService(userDetailsService);
        // 认证逻辑的提供者,设置PasswordEncoder
        daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);

        authenticationManager = new ProviderManager(daoAuthenticationProvider);
        return authenticationManager;
    }

    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails userDetails = User.withDefaultPasswordEncoder()
                .username("user")
                .password("123")
                .roles("USER")
                .build();
        // 使用内存模式的UserDetailsService 
        return new InMemoryUserDetailsManager(userDetails);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        // 默认PasswordEncoder
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }
}
 

2.自定义Filter

代码如下(示例):

public class AuthenticationTokenFilter extends OncePerRequestFilter {
    public final AuthenticationManager manager;
    public AuthenticationTokenFilter(AuthenticationManager manager) {
        this.manager = manager;
    }
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("执行我的过滤器啦~~~");

        String userName = request.getHeader("userName");
        String password = request.getHeader("password");
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(userName, password);
        // 验证Authentication对象,并将其设置在上下文环境中
        SecurityContextHolder.getContext().setAuthentication(this.manager.authenticate(token));

        filterChain.doFilter(request, response);
    }
}

五、测试

        访问请求+不带header信息;

        访问请求+带header信息,header中包含正确的用户名/密码;

        访问请求+带header信息,header中包含错误的用户名/密码;


总结

        建议先看前两篇博文介绍,再看这一篇简单的实操文,能帮助深入理解。

  • 23
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security 6.x 是一个用于保护Spring应用程序的框架。它主要用于认证和授权功能,可以帮助我们构建安全的应用程序。 Spring Security 6.x 提供了丰富的特性和功能,包括基于角色或权限的访问控制、密码加密、单点登录(SSO)、防止CSRF(跨站请求伪造)攻击、防止会话固定攻击等。 在Spring Security 6.x 中,认证可以使用多种方式,包括基于用户名和密码的认证、基于LDAP(轻量级目录访问协议)的认证、基于OpenID Connect的认证等。它还支持自定义的认证流程,可以根据具体需求进行配置。 授权是Spring Security 6.x 的另一个重要功能。它可以通过注解、表达式或配置文件来实现精细的访问控制。我们可以根据用户的角色或权限来限制他们对资源的访问权限,确保只有具备相应权限的用户可以执行某些操作。 Spring Security 6.x 还提供了一些额外的安全功能,如密码加密、会话管理、记住我功能等。密码加密可以确保用户的密码不会被明文存储,会话管理可以管理用户的会话状态,而记住我功能可以通过“记住我”cookie来实现用户持久登录。 总的来说,Spring Security 6.x 是一个强大、灵活且易于使用的安全框架,可以帮助我们构建安全可靠的Spring应用程序。无论是小型Web应用还是大型企业级应用,都可以使用Spring Security来保护应用的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值