Looking for spring-security Answers? Try Ask4KnowledgeBase
Looking for spring-security Keywords? Try Ask4Keywords

spring-securityНачало работы с пружинной безопасностью


замечания

В этом разделе представлен обзор того, что такое весна-безопасность, и почему разработчик может захотеть его использовать.

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

Версии

Версия Дата выхода
4.2.2 2017-03-02
3.2.10 2016-12-22
4.2.1 2016-12-21
4.1.4 2016-12-21
4.2.0 2016-11-10

Привет, Spring Security

Примечание 1. Перед началом использования этих примеров вам понадобятся некоторые предварительные знания о странице сервлетов Java (JSP) и Apache Maven .

Запустите веб-сервер (например, Apache tomcat ) с существующим веб-проектом или создайте его.

Посетите index.jsp .

Любой может получить доступ к этой странице, это небезопасно!


Защита приложения

  1. Обновление зависимостей Maven

Добавление зависимостей в файл pom.xml

pom.xml

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-web</artifactId>
  <version>4.0.1.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-config</artifactId>
  <version>4.0.1.RELEASE</version>
</dependency>
 

Примечание 1: Если вы раньше не использовали «Spring» в своем проекте, зависимость от «spring-context» не существует. В этом примере будет использоваться xml config с «spring-context». Поэтому добавьте эту зависимость тоже.

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.2.2.RELEASE</version>
</dependency>
 

Примечание 2: Если вы ранее не используете JSTL в своем проекте, это не связано с этим. В этом примере будет использоваться JSTL на странице jsp. Поэтому добавьте эту зависимость тоже.

<dependency>
  <groupId>org.glassfish.web</groupId>
  <artifactId>javax.servlet.jsp.jstl</artifactId>
  <version>1.2.1</version>
</dependency>
 

  1. Сделать файл конфигурации безопасности Spring

Создайте имя папки «spring» внутри папки «WEB-INF» и создайте файл security.xml. Скопируйте и вставьте из следующих кодов.

WEB-INF / весна / security.xml

<b:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:b="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                             http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

  <http />

  <user-service>
    <user name="stackoverflow" password="pwd" authorities="ROLE_USER" />
  </user-service>

</b:beans>
 

  1. Обновление web.xml

Обновите свой web.xml внутри папки «WEB-INF»

WEB-INF / web.xml

<filter>
  <filter-name>springSecurityFilterChain</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
 

Примечание. Если вы раньше не использовали «Spring» в своем проекте, нет конфигураций загрузки Spring. Поэтому добавьте этот параметр и слушатель.

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
    /WEB-INF/spring/*.xml
  </param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 

Запуск безопасного веб-приложения

После запуска вашего веб-сервера и посещения index.jsp вы увидите страницу входа по умолчанию, созданную весной. Потому что вы не аутентифицированы.

страница входа, созданная весной

Вы можете войти в систему

username : stackoverflow
password : pwd
 

Примечание: имя пользователя и пароль на WEB-INF / spring / security.xml


Отображение имени пользователя

Добавление тега jstl после «Hello», который печатает имя пользователя

index.jsp

<h1>Hello <c:out value="${pageContext.request.remoteUser}" />!!</h1>
 

Отображение имени пользователя


Выход из системы

index.jsp

Добавление формы, ввод тегов после «Привет имя пользователя», который отправляет сгенерированный отладочный url / logout из весенней безопасности.

<h1>Hello <c:out value="${pageContext.request.remoteUser}" />!!</h1>

<form action="/logout" method="post">
  <input type="submit" value="Log out" />
  <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
 

Когда вы успешно выходите из системы, вы снова видите автоматически созданную страницу входа в систему. Из-за того, что вы не авторизованы сейчас.

Выход из системы, выход из системы

Установка или настройка

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

Spring Securitiy для защиты конечных точек API REST

Добавьте ниже записи в pom.xml .

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>3.1.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>3.1.0.RELEASE</version>
</dependency>
 

Важно для версии весны больше 3,1:

Ошибка создания org.springframework.security.filterChains для org.springframework.security.filterChains появляется, когда вы используете версию Spring выше 3.1 и не добавляете зависимости вручную для spring-aop , spring-jdbc , spring-tx и spring-expressions в вашем pom.xml .

Добавьте элементы ниже в контексте Spring. Мы хотим защитить две конечные точки REST (helloworld & goodbye). Отрегулируйте версию XSD в соответствии с версией Spring.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:security="http://www.springframework.org/schema/security"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
                       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
                       http://www.springframework.org/schema/security
                       http://www.springframework.org/schema/security/spring-security-3.1.xsd">
                               
    <security:http auto-config='true' create-session="never">
        <security:intercept-url pattern="/helloworld/**" access="ROLE_USER" />
        <security:intercept-url pattern="/goodbye/**" access="ROLE_ADMIN" />
        <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:http-basic />
    </security:http>

    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="username1" password="password1"
                    authorities="ROLE_USER" />
                <security:user name="username2" password="password2"
                    authorities="ROLE_ADMIN" />
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>
</beans>
 

Добавьте ниже элементы в web.xml .

<!-- Spring security-->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:security-context.xml</param-value>
</context-param>
 

Spring-Security с использованием Spring-Boot и JDBC-аутентификации

Предположим, вы хотите, чтобы неавторизованные пользователи могли получить доступ к странице, тогда вы должны наложить на них барьер, разрешив доступ. Мы можем это сделать, используя Spring-security, которая обеспечивает базовую аутентификацию, обеспечивая защиту всех конечных точек HTTP. Для этого вам нужно добавить зависимость Spring-security к вашему проекту, в maven мы можем добавить зависимость как:

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

Вот настройка безопасности, обеспечивающая доступ только к аутентифицированным пользователям.

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
DataSource datasource;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest()
            .fullyAuthenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .failureUrl("/login?error")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login?logout")
            .permitAll()
            .and()
        .csrf();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.jdbcAuthentication().dataSource(datasource).passwordEncoder(passwordEncoder());
}

@Bean
public PasswordEncoder passwordEncoder() {
    PasswordEncoder encoder = new BCryptPasswordEncoder();
    return encoder;
}
}
 
конфигурация Описание
@Configuration Указывает, что класс может использоваться контейнером Spring IoC в качестве источника определений bean-компонентов.
@Order (SecurityProperties.ACCESS_OVERRIDE_ORDER) Переопределите правила доступа без изменения каких-либо других автоконфигурированных функций. Более низкие значения имеют более высокий приоритет.
WebSecurityConfigurerAdapter Класс SecurityConfig расширяет и переопределяет несколько своих методов, чтобы установить некоторые особенности конфигурации безопасности.
@Autowired of DataSource Обеспечьте завод для подключения к физическому источнику данных.
configure(HttpSecurity) Переопределенный метод определяет, какие пути URL должны быть защищены, а какие нет.
.authorizeRequests().anyRequest() .fullyAuthenticated() Указывает на весну, что все запросы к нашей заявке требуют аутентификации.
.formLogin() Настраивает логин на основе формы
.loginPage("/login").failureUrl("/login?error").permitAll() Указывает местоположение страницы входа в систему, и всем пользователям должно быть разрешено обращаться к странице.
.logout().logoutUrl("/logout") .logoutSuccessUrl("/login?logout").permitAll() URL-адрес для перенаправления после выхода из системы произошел. По умолчанию используется логин / login.
.csrf() Используется для защиты от перекрестных запросов, защита CSRF включена (по умолчанию).
configure(AuthenticationManagerBuilder){} Переопределенный метод определения аутентификации пользователей.
.jdbcAuthentication().dataSource(datasource) Указывает на то, что мы используем аутентификацию JDBC
.passwordEncoder(passwordEncoder()) Указывает на весну, что мы используем кодировщик паролей для кодирования наших паролей. (Компонент создан для возврата выбора пароля Encoder, в этом случае мы используем BCrypt)

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

create table users (   
  username varchar(50) not null primary key,
  password varchar(255) not null,
  enabled boolean not null) ;

create table authorities (
  username varchar(50) not null,
  authority varchar(50) not null,
  foreign key (username) references users (username),
  unique index authorities_idx_1 (username, authority));
 

Вставьте следующие строки в приведенные выше таблицы:

INSERT INTO authorities(username,authority) 
VALUES ('user', 'ROLE_ADMIN');

INSERT INTO users(username,password,enabled)
VALUES('user', '$2a$10$JvqOtJaDys0yoXPX9w47YOqu9wZr/PkN1dJqjG9HHAzMyu9EV1R4m', '1');
 

Имя пользователя в нашем случае - user а пароль также зашифрован user с помощью алгоритма BCrypt

Наконец, настройте источник данных в application.properties для загрузки весны:

spring.datasource.url = jdbc:mysql://localhost:3306/spring
spring.datasource.username = root
spring.datasource.password = Welcome123
 

Примечание. Создайте и настройте контроллер входа и сопоставьте его с пути /login и укажите свою страницу входа в этот контроллер