SpringBoot интегрирует опыт входа в Spring Security

Spring Boot

Введение

Spring SecurityиApache ShiroОба являются платформами безопасности, которые обеспечивают аутентификацию и авторизацию для приложений Java.

разница между двумя
  1. Весенняя безопасность:Система безопасности Magnitude
  2. Apache Shiro:Система безопасности Magnitude

Для авторизации и авторизации широ, пожалуйста, обратитесь к другой статье редактора:SpringBoot интегрирует Shiro для получения разрешений на динамическую загрузку.

https://blog.csdn.net/qq_38225558/article/details/101616759

Во-вторых, SpringBoot интегрировал возможности входа в Spring Security.

Базовая среда: springboot 2.1.8

1. Представьте зависимости Spring Security

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

2. Создайте новый контроллер для проверки доступа

@RestController
public class IndexController {
    @GetMapping("/index")
    public String index() {
        return "Hello World ~";
    }
}

3. Запустите доступ к проектуhttp://127.0.0.1:8080/index

Теплые советы: имя пользователя по умолчанию, данное Spring Security без какой-либо настройки.userПароль представляет собой строку случайно сгенерированных строк при запуске и запуске проекта, и он будет напечатан на консоли, как показано ниже:在这里插入图片描述Когда мы посещаем домашнюю страницу индекса, система по умолчанию переходит на страницу входа для аутентификации входа.

在这里插入图片描述После успешной аутентификации мы перейдем на нашу индексную страницу.在这里插入图片描述

Три, конфигурация пароля пользователя Spring Security

В дополнение к пользователю, заданному Spring Security по умолчанию без какой-либо конфигурации вышеuserПароль генерирует случайную строку при запуске проекта, и мы также можем настроить его следующими способами

1. Настроен в конфигурационном файле springboot

spring:
  security:
    user:
      name: admin  # 用户名
      password: 123456  # 密码

2. Java-код настраивается в памяти

Новое наследование класса конфигурации ядра безопасностиWebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity // 启用Spring Security的Web安全支持
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 将用户设置在内存中
     * @param auth
     * @throws Exception
     */
    @Autowired
    public void config(AuthenticationManagerBuilder auth) throws Exception {
        // 在内存中配置用户,配置多个用户调用`and()`方法
        auth.inMemoryAuthentication()
                .passwordEncoder(passwordEncoder()) // 指定加密方式
                .withUser("admin").password(passwordEncoder().encode("123456")).roles("ADMIN")
                .and()
                .withUser("test").password(passwordEncoder().encode("123456")).roles("USER");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        // BCryptPasswordEncoder:Spring Security 提供的加密工具,可快速实现加密加盐
        return new BCryptPasswordEncoder();
    }

}

3. Получите информацию об учетной записи пользователя и пароле из базы данных.

Этот метод также обычно используется в наших проектах, которые мы оставим для следующей статьи.

4. Обработка входа в Spring Security и игнорирование перехвата

Соответствующий код прокомментирован, и я считаю, что его легко понять.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 登录处理
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 开启登录配置
        http.authorizeRequests()
                // 标识访问 `/index` 这个接口,需要具备`ADMIN`角色
                .antMatchers("/index").hasRole("ADMIN")
                // 允许匿名的url - 可理解为放行接口 - 多个接口使用,分割
                .antMatchers("/", "/home").permitAll()
                // 其余所有请求都需要认证
                .anyRequest().authenticated()
                .and()
                // 设置登录认证页面
                .formLogin().loginPage("/login")
                // 登录成功后的处理接口 - 方式①
                .loginProcessingUrl("/home")
                // 自定义登陆用户名和密码属性名,默认为 username和password
                .usernameParameter("username")
                .passwordParameter("password")
                // 登录成功后的处理器  - 方式②
//                .successHandler((req, resp, authentication) -> {
//                    resp.setContentType("application/json;charset=utf-8");
//                    PrintWriter out = resp.getWriter();
//                    out.write("登录成功...");
//                    out.flush();
//                })
                // 配置登录失败的回调
                .failureHandler((req, resp, exception) -> {
                    resp.setContentType("application/json;charset=utf-8");
                    PrintWriter out = resp.getWriter();
                    out.write("登录失败...");
                    out.flush();
                })
                .permitAll()//和表单登录相关的接口统统都直接通过
                .and()
                .logout().logoutUrl("/logout")
                // 配置注销成功的回调
                .logoutSuccessHandler((req, resp, authentication) -> {
                    resp.setContentType("application/json;charset=utf-8");
                    PrintWriter out = resp.getWriter();
                    out.write("注销成功...");
                    out.flush();
                })
                .permitAll()
                .and()
                .httpBasic()
                .and()
                // 关闭CSRF跨域
                .csrf().disable();

    }

    /**
     * 忽略拦截
     * @param web
     * @throws Exception
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        // 设置拦截忽略url - 会直接过滤该url - 将不会经过Spring Security过滤器链
        web.ignoring().antMatchers("/getUserInfo");
        // 设置拦截忽略文件夹,可以对静态资源放行
        web.ignoring().antMatchers("/css/**", "/js/**");
    }

}

V. Резюме

  1. В проекте представлены зависимости Spring Security
  2. Наследование класса пользовательской конфигурации ядра безопасностиWebSecurityConfigurerAdapter
  3. Конфигурация пароля учетной записи
  4. Обработка входа
  5. игнорировать перехват
Исходный код демо кейса

git ee.com/ слегка нажимает…