Практика с вами, чтобы начать работу с Spring Security!

Spring Boot
Практика с вами, чтобы начать работу с Spring Security!

Spring Security — это фреймворк управления безопасностью семейства Spring.На самом деле, до появления Spring Boot Spring Security разрабатывался много лет, но мало использовался.Сфера управления безопасностью всегда была миром Широ.

По сравнению с Shiro, интеграция Spring Security в SSM/SSH — более хлопотная операция, поэтому Spring Security хотя и мощнее Shiro, но используется не так часто, как Shiro, то есть Shiro достаточно).

Начиная с Spring Boot, Spring Boot предоставляет решение для автоматической настройки Spring Security, а Spring Security можно использовать без настройки.

Итак, в общем случае общая комбинация стеков технологий управления безопасностью выглядит так:

  • SSM + Shiro
  • Spring Boot/Spring Cloud + Spring Security

Обратите внимание, что это всего лишь рекомендуемая комбинация, если говорить чисто технически, какая бы комбинация ни была, она будет работать.

Давайте посмотрим на конкретное использование.

1. Создание проекта

Использовать Spring Security в Spring Boot очень просто, просто введите зависимости:

Зависимости Spring Security в pom.xml:

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

При добавлении зависимостей все интерфейсы проекта будут автоматически защищены.

2. Первый опыт

Создаем HelloController:

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

доступ/hello, вам необходимо войти в систему, чтобы получить доступ.

Когда пользователь отправляет запрос из браузера на доступ/helloинтерфейс, сервер вернется302Код ответа, пусть клиент перенаправляется на/loginстраница, пользователь/loginВход на страницу, после успешного входа она автоматически перейдет на/helloинтерфейс.

В качестве альтернативы вы можете использоватьPOSTMANдля отправки запроса используйтеPOSTMANПри отправке запроса вы можете указать информацию о пользователе в заголовке запроса (это позволит избежать перенаправления на страницу входа):

Из приведенных выше двух разных методов входа видно, что Spring Security поддерживает два разных метода аутентификации:

  • Может быть аутентифицирован через форму формы
  • Может быть аутентифицирован HttpBasic

3. Конфигурация имени пользователя

По умолчанию имя пользователя, вошедшего в систему,user, пароль представляет собой случайно сгенерированную строку при запуске проекта.Вы можете увидеть пароль по умолчанию из журнала запуска консоли:

Этот случайно сгенерированный пароль меняется каждый раз при загрузке. Существует три различных способа настройки имени пользователя/пароля для входа:

  • Настроить в application.properties
  • Настраивается в памяти с помощью Java-кода
  • Загрузка из базы данных через Java

Первые две относительно просты, а третья немного крупнее.В этой статье сначала будут рассмотрены первые две, а третья будет написана отдельно позже.Также можете сослаться на мою.Микро кадровый проект.

3.1 Имя пользователя/пароль конфигурации файла конфигурации

Базовую информацию о пользователе можно настроить прямо в файле application.properties:

spring.security.user.name=javaboy
spring.security.user.password=123

После завершения настройки перезапустите проект, и вы сможете войти в систему с настроенным здесь именем пользователя/паролем.

3.2 Имя пользователя и пароль для конфигурации Java

Имя пользователя и пароль также можно настроить в коде Java.Во-первых, нам нужно создать класс конфигурации Spring Security, который интегрирован из класса WebSecurityConfigurerAdapter следующим образом:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //下面这两行配置表示在内存中配置了两个用户
        auth.inMemoryAuthentication()
                .withUser("javaboy").roles("admin").password("$2a$10$OR3VSksVAmCzc.7WeaRPR.t0wyCsIj24k0Bne8iKWV1o.V9wsP8Xe")
                .and()
                .withUser("lisi").roles("user").password("$2a$10$p1H8iWa8I4.CA.7Z8bwLjes91ZpY.rYREGHQEInNtAp4NzL6PLKxi");
    }
    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

Здесь мы настроили двух пользователей в методе configure.Пароль пользователя представляет собой зашифрованную строку (открытый текст 123).Начиная с Spring 5 шифрование пароля является обязательным.Если вы не хотите шифровать его, вы можете использовать просроченный экземпляр PasswordEncoder NoOpPasswordEncoder, но это не рекомендуется, в конце концов, это небезопасно.

Spring Security предоставляет инструмент кодирования паролей BCryptPasswordEncoder, который может быть очень удобен для шифрования и соли паролей.Результаты шифрования одного и того же открытого текста всегда разные, поэтому пользователям не нужно сохранять дополнительныеполе, что гораздо удобнее Широ.

4. Конфигурация входа

Для интерфейса входа ответ после успешного входа и ответ после неудачного входа можно настроить в классе реализации WebSecurityConfigurerAdapter. Например следующее:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    VerifyCodeFilter verifyCodeFilter;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(verifyCodeFilter, UsernamePasswordAuthenticationFilter.class);
        http
        .authorizeRequests()//开启登录配置
        .antMatchers("/hello").hasRole("admin")//表示访问 /hello 这个接口,需要具备 admin 这个角色
        .anyRequest().authenticated()//表示剩余的其他接口,登录之后就能访问
        .and()
        .formLogin()
        //定义登录页面,未登录时,访问一个需要登录之后才能访问的接口,会自动跳转到该页面
        .loginPage("/login_p")
        //登录处理接口
        .loginProcessingUrl("/doLogin")
        //定义登录时,用户名的 key,默认为 username
        .usernameParameter("uname")
        //定义登录时,用户密码的 key,默认为 password
        .passwordParameter("passwd")
        //登录成功的处理器
        .successHandler(new AuthenticationSuccessHandler() {
            @Override
            public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {
                    resp.setContentType("application/json;charset=utf-8");
                    PrintWriter out = resp.getWriter();
                    out.write("success");
                    out.flush();
                }
            })
            .failureHandler(new AuthenticationFailureHandler() {
                @Override
                public void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse resp, AuthenticationException exception) throws IOException, ServletException {
                    resp.setContentType("application/json;charset=utf-8");
                    PrintWriter out = resp.getWriter();
                    out.write("fail");
                    out.flush();
                }
            })
            .permitAll()//和表单登录相关的接口统统都直接通过
            .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessHandler(new LogoutSuccessHandler() {
                @Override
                public void onLogoutSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {
                    resp.setContentType("application/json;charset=utf-8");
                    PrintWriter out = resp.getWriter();
                    out.write("logout success");
                    out.flush();
                }
            })
            .permitAll()
            .and()
            .httpBasic()
            .and()
            .csrf().disable();
    }
}

Мы можем настроить обратный вызов для успешного входа в метод successHandler. Если интерфейс и сервер разделены и разработаны, JSON может быть возвращен после успешного входа в систему. Точно так же обратный вызов для неудачного входа настраивается в методе failureHandler. , а обратный вызов для успешного выхода настраивается в logoutSuccessHandler.

5. Игнорировать перехват

Если адрес запроса не нужно перехватывать, есть два способа добиться этого:

  • Установите этот адрес для анонимного доступа
  • Отфильтровать адрес напрямую, то есть адрес не проходит через цепочку фильтров Spring Security

Рекомендуется использовать второе решение, конфигурация следующая:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/vercode");
    }
}

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

Сначала эта статья остановится здесь, если у вас есть какие-либо вопросы, пожалуйста, оставьте сообщение для обсуждения.

Обратите внимание на общедоступный номер [Jiangnan A Little Rain], сосредоточьтесь на полнофункциональных технологиях, таких как Spring Boot + микросервисы и разделение интерфейсной и серверной части, делитесь регулярными видеоуроками, отвечайте на Java после подписки и получайте Java галантереи, тщательно подготовленные Songge для вас!