springboot3项目的搭建四(security登录认证配置)

springboot3项目的搭建四(security登录认证配置)

 

 

            <!--security安全配置-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
                <version>${springboot.version}</version>
            </dependency>

 

给项目引入security安全依赖后,默认以web形式拦截所有请求. (这是就需要配置,设置一些参数和开放登录的路径)

security是一系列的过滤器链,进行层层拦截,当然我们也可以按照规则自定义过滤器加入链中,如之后的验证码过滤器(要放在UsernamePasswordAuthenticationFilter之前进行),jwt的token验证等。

 

security的认证流程大体是:

https://www.bilibili.com/video/BV1Dt4y1e74H

https://www.bilibili.com/video/BV1ET4y1H7KQ

 

配置类: 新版的配置类就只是一个类,不推荐继承其他类或接口.

 

 我们重点, 1.写配置文件,2.实现接口UserDetailsService 的 loadUserByUsername(username)方法(通过用户名查用户信息和权限列表),返回一个UserDetails 接口的实现类。UserDetails 接口可以自己实现也可以用框架实现好的org.springframework.security.core.userdetails.User

@Service("UserDetailsService")
public class MyUserDetailsService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //返回UserDetails接口,我们必须写一个UserDetails的实现类返回,或者用框架已经写好的User类
        //1.从数据库中查询用户名信息及权限 2.封装成UserDetails数据返回

        //1)模拟权限
        List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("admin,manage,ROLE_sale");
        //2)模拟用户信息
        //org.springframework.security.core.userdetails.User;
        User user = new User("用户名",new BCryptPasswordEncoder().encode("密码"),auths);//密码是数据库获取的密码密文

        return user;
    }
}

3. 如果自己实现userDetails接口,重写原有方法外,最好里面加用户实体,user_id,token, password ,权限列表信息等。

获取到UserDetails 后,框架会自行按照过滤器链执行 加密算法比对密码密文.

4.密码比对成功最后,认证信息设置securityContextHolder,存起来(redis,数据库或其他地方,如果存数据库数据表结构是固定的,可以用程序生成后,注释掉)

配置项:

    /**
     * 记住我功能的数据库配置(在配置项中rememberMe最好配置token过期时间)
     * @return
     */

    @Bean
    public PersistentTokenRepository persistentTokenRepository(){
        JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
        tokenRepository.setDataSource(dataSource);
        // 如果token表不存在,使用下面语句可以初始化该表;若存在,请注释掉这条语句,否则会报错。
        //tokenRepository.setCreateTableOnStartup(true);
        return tokenRepository;
    }

总结:(我们就实现UserDetailsService接口和UserDetails接口)

 

 ---------------------------------------------------

方法一:如果用原始登录,不改原始login页面, 实现两个接口,1.UserDetailsService  2.UserDetails  .最后配置下,登录成功的着陆页。

(大多数都是默认的类,manager委托provider去验证...)

方法二:如果使用json的jwt方式验证,我们在配置文件中自己生成manager 和 provider去验证。

 上图是,在配置文件中,配置一个authenticationManage的Bean, Spring在启动时会加载,把自定义UserDetailsService和密码验证加入,在验证时使用.

 上图是,我们自己写登录地址是,把用户名和密码封装成UsernamePasswordAuthenticationToken后,使用上面配置的Bean,进行验证,调用的都是我们自定义的UserDetailsService和密码加密算法。

 

配置类:  springboot2-security5.7和springboot3-security6有区别

 

 此外,1.我们还可以定义Handle继承相应接口,完善验证功能。(如认证失败处理类AuthenticationEntryPointImpl,退出处理器LogoutSuccessHandlerImpl)

//认证失败处理器
        //http.exceptionHandling().authenticationEntryPoint(customAuthenticationEntryPoint);

2.我们还可以写过滤器,加载原始的过滤器链的指定位置。(如token认证过滤器JwtAuthenticationTokenFilter,验证码验证逻辑过滤器ValidateCodeFilter)

// 添加JWT filter (验证码过滤器,加载用户密码验证器之前)
        httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);

 

// 配置登录之前添加一个验证码的过滤器
        http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class);

 

 

 未完.....

 

 

 

 

 springboot2和springboot3的区别,在于2的配置项是链式中间用.and()连接,3是用lambdas表达式把链式的配置都写到括号中.

 https://docs.spring.io/spring-security/reference/migration-7/configuration.html

 

 

 总之,要么重写UserDetailsService和UserDetails,其他流程用默认的提供的AuthenticationManager等, 另一种在配置文件暴露一个AuthenticationManager接口实现类,里面设置上UserDetailsService和加密方式,重写验证流程.

    @Bean
    public AuthenticationManager authenticationManager() throws Exception {
        DaoAuthenticationProvider provider =  new DaoAuthenticationProvider();
        provider.setPasswordEncoder(bCryptPasswordEncoder());
        provider.setUserDetailsService(userDetailsServiceImpl);
        return new ProviderManager(provider);
    }

 也可以这样暴露一个AuthenticationManager:

 

自己的service写登录流程:

 

 

 

 

 配置文件,还有就是一大批过滤规则,开放登录地址,开放静态资源,成功处理器,失败处理器, 验证码过滤器,jwt验证过滤器,过滤器可以加到指定过滤器之前.

 

 

 

 

 https://www.bilibili.com/video/BV1ib421i7Pc

 https://docs.spring.io/spring-security/reference/index.html

 https://blog.csdn.net/2301_78646673/article/details/134801772

https://www.jb51.net/article/281314.htm

 

 https://www.cnblogs.com/fps2tao/p/17409309.html

https://www.cnblogs.com/fps2tao/p/17356448.html

 

https://www.cnblogs.com/fps2tao/p/17393274.html

https://blog.csdn.net/qq_63218110/article/details/136095651

 

posted @ 2024-05-31 21:24  与f  阅读(235)  评论(0编辑  收藏  举报