SpringSecurity

项目源码:https://github.com/eazybytes/springsecurity6

入门:基本配置

springboot导入依赖springsecurity依赖

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

<dependency>.   <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
package com.eazybytes.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class ProjectSecurityConfig {

    @Bean
    SecurityFilterChain  defaultSecurityFilterChain(HttpSecurity http) throws Exception {


        http.authorizeHttpRequests((requests) -> requests
                        .requestMatchers("/myAccount","/myBalance","/myLoans","/myCards").authenticated()
                        .requestMatchers("/notices","/contact").permitAll())
                .formLogin(Customizer.withDefaults())
                .httpBasic(Customizer.withDefaults());
        return http.build();
    }

}

可以看到/myAccount","/myBalance","/myLoans","/myCards"这些路径需要认证之后我们才能访问

这两个路径无需认证"/notices","/contact"

当我们访问需要认证的路径时候,他会自动跳转到登录页,登录之后才可以访问

关于这里的用户名,可以在配置文件设置,如下:

spring.security.user.name = eazybytes
spring.security.user.password = 12345

不配置的话,会在控制台打印输出

但我们日常生活中,都是通过查询数据库来获取用户,下面进行讲解利用数据源进行登录授权

认证:基于数据源

1.实现UserDetailsService接口,重写loadUserByUsername方法

可以看到有一个username参数,这个参数正是前面login登录也传过来的用户名,我们根据这个参数调用service层,查看是否有这个用户,如果没有这个用户,直接抛出UserNameNotFoundException,springsecurity会根据这个异常进行后续处理,如果用户存在,我们将查出来的用户名,密码及用户角色传给User对象,后续进行这里的password和登录界面输入的password比对,进行后续处理

2.springsecurity还可以对密码进行加密处理,只需要在springboot容器中注入对应的对象

可以看到我这里注入的对象是没有进行加密处理的,返回的是一个PasswordEncoder接口的对象

在这里可以看到很多进行密码加密实现类,我们可以注入对应算法的密码加密方法,当然,我们也可以定义自己的密码加密方法,只需要实现这个接口,并将其注入到spring容器中;

首先定义一个累实现这个接口,重写里面的方法,三个方法的作用,你可以询问gpt,下面是我询问的结果

可以看到,我们只需要关注第二个方法,这个方法传递过来两个参数,第一个参数是前端页面用户输入的,第二个是loadUserByName查询出来的用户密码,我们可以自己进行比对,返回true,则用户登录成功,false则登录失败。

认证:基于内存

上述是进行数据源进行用户认证的,我们也可以通过基于内存认证,spring容器中注入InMemoryUserDetailsManager对象