从零开始开发鉴权系统:1.接入SpringSecurity实现自定义表单认证

1.加入SpringSecurity依赖

       <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-security</artifactId>
         <version>2.7.8</version>
       </dependency>

加入依赖后security会自动开启认证,访问项目的接口会自动转到/login页面

2.自定义认证

实现UserDetailsService接口

自定义逻辑根据用户名构建UserDetails类,初始化用户密码、权限。

如果用户信息存在数据库中,数据库中要存储加密后的密码,即调用PasswordEncoder.encode加密后存到数据库中,因为用户登录后密码会自动调用PasswordEncoder.matches验证输入密码和数据库中存储的加密后的密码。

 @Service
 public class SpringSecurityUserServiceImpl implements UserDetailsService {
 ​
     @Resource
     private UserFeignClient userFeignClient;
 ​
     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
         ResponseResult<LoginUser> loginUser = userFeignClient.findByUsername(username);
         if (loginUser == null || loginUser.getData() == null) {
             throw new UsernameNotFoundException("user not found");
         }
 ​
         //TODO 用户权限
         List<GrantedAuthority> grantedAuthorityList = new ArrayList<>();
         GrantedAuthority grantedAuthority = () -> null;
         grantedAuthorityList.add(grantedAuthority);
 ​
         return new User(username,loginUser.getData().getPassword(),grantedAuthorityList);
     }
 ​
 }

实现PasswordEncoder接口

可以自定义PasswordEncoder实现类,也可以用SpringSecurity默认提供的类,如果用默认提供的类注意在配置类中注入该类.

3.配置类配置

配置认证策略

 /**
  * springSecurity全局配置
  * @author zp
  */
 @Configuration
 @EnableWebSecurity
 public class SecurityConfig {
 ​
     @Bean
     public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
         http
                 //配置需要认证的接口路径
                 .authorizeHttpRequests(auth -> auth
                         //白名单
                         .antMatchers("/userInfo/findByUsername").permitAll()
                         //其余所有接口都需要认证
                         .anyRequest().authenticated()
                 )
 //                .formLogin( form -> form
 //                        .loginPage("/login") // 自定义登录页面
 //                        .loginProcessingUrl("/login") // 处理登录请求的URL
 //                        .defaultSuccessUrl("/welcome", true) // 登录成功后的默认跳转URL
 //                        .failureUrl("/login?error") // 登录失败后的URL
 //                        .permitAll() // 允许任何人访问登录页面
 //                )
                 .formLogin(withDefaults())
                 .logout(withDefaults())
                 //远程api访问配置,即如果此项开启通过api访问会弹出登录框,不开启会返回登录页面
                 .httpBasic(withDefaults())
                 //对于所有非get方法,默认开启csrf保护,都必须在header中加上csrftoken,就算配置了白名单也没用
                 .csrf(withDefaults())
                 //记住我,生成一个包含用户身份信息的cookie,并在用户浏览器上保存,并且默认使用一个密匙来加密
                 .rememberMe(withDefaults());
         return http.build();
     }
 ​
     @Bean
     public PasswordEncoder passwordEncoder() {
         return new BCryptPasswordEncoder();
     }
 ​
 }
 ​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值