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 后,框架会自行按照过滤器链执行 加密算法比对密码密文.
总结:(我们就实现UserDetailsService接口和UserDetails接口)
---------------------------------------------------
方法一:如果用原始登录,不改原始login页面, 实现两个接口,1.UserDetailsService 2.UserDetails .最后配置下,登录成功的着陆页。
(大多数都是默认的类,manager委托provider去验证...)
方法二:如果使用json的jwt方式验证,我们在配置文件中自己生成manager 和 provider去验证。
上图是,在配置文件中,配置一个authenticationManage的Bean, Spring在启动时会加载,把自定义UserDetailsService和密码验证加入,在验证时使用.
上图是,我们自己写登录地址是,把用户名和密码封装成UsernamePasswordAuthenticationToken后,使用上面配置的Bean,进行验证,调用的都是我们自定义的UserDetailsService和密码加密算法。
配置类:
此外,1.我们还可以定义Handle继承相应接口,完善验证功能。(如认证失败处理类AuthenticationEntryPointImpl,退出处理器LogoutSuccessHandlerImpl)
//认证失败处理器 //http.exceptionHandling().authenticationEntryPoint(customAuthenticationEntryPoint);
2.我们还可以写过滤器,加载原始的过滤器链的指定位置。(如token认证过滤器JwtAuthenticationTokenFilter,验证码验证逻辑过滤器ValidateCodeFilter)
// 添加JWT filter (验证码过滤器,加载用户密码验证器之前) httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
// 配置登录之前添加一个验证码的过滤器 http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class);
未完.....
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
标签:UserDetailsService,验证,认证,springboot3,https,过滤器,security,UserDetails From: https://www.cnblogs.com/fps2tao/p/18222453