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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步