跳到文章开头
  1. Theories/

Spring-Security

·1 分钟
spring
 ·  页面点击量:
目录

基于Spring6+JDK18的SpringSecurity环境的项目DEMO
#

项目地址:

基本实现的功能
#

  • Security通过数据库实现自定义登录
  • 通过自己添加的过滤器链完成JWT+Token的请求权限认证
  • Token加入Redis做无状态无Session处理
  • 邮箱验证码收发功能

注意事项
#

sql执行脚本在项目doc文件目录下,Security在Spring6下已经废除

通过WebSecurityAdaptor来实现HttpSecurity这个Bean的配置注入。

目前只支持Lamda表达式。

请在application.yml中自行配置自己的邮箱SMTP服务

配置案例:


    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        return http
                .authorizeHttpRequests(conf->conf
                        .requestMatchers("/**").permitAll()
                )
                .formLogin(conf -> conf
                        .loginProcessingUrl("/auth/login").permitAll()
                        .successHandler(new LoginSuccessHandler(accountService,jwtUtils,stringRedisTemplate))
                        .failureHandler(new LoginFailureHandler())
                )
                .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
                .csrf(AbstractHttpConfigurer::disable)//关闭跨域漏洞防御配置
                .logout(conf->conf
                        .logoutUrl("/auth/logout")
                        .logoutSuccessHandler(new LogOutHandler(redisTemplate,jwtUtils)))
                .exceptionHandling(conf->conf.accessDeniedHandler((request, response, accessDeniedException)
                        -> System.out.println("当前异常的登录信息:"+accessDeniedException)))
                .build();
    }

搭建要点
#

登录用户实体必须实现UserDetails接口,数据层,业务层(实际处理登录逻辑,俗称Impl)必须实现

UserDetailsService接口,同时重写

public UserDetails loadUserByUsername(String username) 方法;

例如:

   Impl

    @Resource
    UserMapper userMapper;
    
    @Override
    public UserDetails loadUserByUsername(String username){
        User user = userMapper.loadUserByUsername(username);
        if (user==null){
            throw new UsernameNotFoundException("用户名不存在!");
        }
        User userDetails = new User();
        userDetails.setUsername(username);
        userDetails.setPassword(user.getPassword());
        return userDetails;
    }

通过自定义的Filter同时继承 OncePerRequestFilter 类,类似于网关处理Request+Response

控制非登录的资源请求权限认证。

拦截器

范围 描述

icon 要在时间线视觉效果中使用的图标。

header 每个条目的标题

badge 放置在右上角徽章内的文本

subheader 条目的副标题

  1. 头部标题

    标签

    副标题

    样式测试
    • Java
    • Python
    • Latex
  2. 图集

    二次元赛高

    此生无悔二次元

相关文章

Docker
·1 分钟
笔记
Music
·1 分钟
笔记
本站Music搭建相关
·1 分钟
笔记