Аннотации используемые в Spring Security
1. @EnableWebSecurity
Аннотация @EnableWebSecurity включает поддержку безопасности на уровне веб-приложений. Она сигнализирует Spring, что текущий класс является конфигурацией безопасности, и подготавливает инфраструктуру Spring Security.
Пример:
Нюансы:
Без этой аннотации конфигурация безопасности не будет применена.
Аннотация автоматически активирует SpringSecurityFilterChain.
2. @Configuration
Используется для указания, что класс содержит настройки и бины Spring Security.
Пример:
Нюансы:
Это аннотация общего назначения, используется в любой конфигурации Spring, включая Spring Security.
Ее можно комбинировать с @EnableWebSecurity.
3. @PreAuthorize
Аннотация @PreAuthorize позволяет выполнять проверку безопасности перед выполнением метода. Условие определяется с помощью SpEL (Spring Expression Language).
Пример:
Нюансы:
Требует включения аннотаций на уровне метода: добавьте @EnableGlobalMethodSecurity(prePostEnabled = true) в класс конфигурации.
Поддерживает сложные выражения SpEL.
4. @PostAuthorize
Выполняет проверку безопасности после выполнения метода. Это полезно, если доступ к результату должен зависеть от данных, возвращенных методом.
Пример:
Нюансы:
Используется реже, так как может повлиять на производительность из-за выполнения после обработки.
Требует @EnableGlobalMethodSecurity(prePostEnabled = true).
5. @Secured
Аннотация @Secured ограничивает доступ к методам на основе ролей. В отличие от @PreAuthorize, она не поддерживает SpEL.
Пример:
Нюансы:
Для использования @Secured необходимо включить метод-базированную безопасность:
Роли должны быть указаны с префиксом ROLE_.
#Java #Training #Spring #Security #Security_Annotations
1. @EnableWebSecurity
Аннотация @EnableWebSecurity включает поддержку безопасности на уровне веб-приложений. Она сигнализирует Spring, что текущий класс является конфигурацией безопасности, и подготавливает инфраструктуру Spring Security.
Пример:
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
// Здесь будут методы настройки безопасности
}
Нюансы:
Без этой аннотации конфигурация безопасности не будет применена.
Аннотация автоматически активирует SpringSecurityFilterChain.
2. @Configuration
Используется для указания, что класс содержит настройки и бины Spring Security.
Пример:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Нюансы:
Это аннотация общего назначения, используется в любой конфигурации Spring, включая Spring Security.
Ее можно комбинировать с @EnableWebSecurity.
3. @PreAuthorize
Аннотация @PreAuthorize позволяет выполнять проверку безопасности перед выполнением метода. Условие определяется с помощью SpEL (Spring Expression Language).
Пример:
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@PreAuthorize("hasRole('ADMIN')")
public void adminOnlyMethod() {
System.out.println("Только для администраторов");
}
@PreAuthorize("#username == authentication.principal.username")
public void userSpecificMethod(String username) {
System.out.println("Только для пользователя: " + username);
}
}
Нюансы:
Требует включения аннотаций на уровне метода: добавьте @EnableGlobalMethodSecurity(prePostEnabled = true) в класс конфигурации.
Поддерживает сложные выражения SpEL.
4. @PostAuthorize
Выполняет проверку безопасности после выполнения метода. Это полезно, если доступ к результату должен зависеть от данных, возвращенных методом.
Пример:
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@PostAuthorize("returnObject.owner == authentication.principal.username")
public Product getProductById(Long id) {
// Имитируем возврат продукта
return new Product(id, "username123");
}
}
class Product {
public Long id;
public String owner;
public Product(Long id, String owner) {
this.id = id;
this.owner = owner;
}
}
Нюансы:
Используется реже, так как может повлиять на производительность из-за выполнения после обработки.
Требует @EnableGlobalMethodSecurity(prePostEnabled = true).
5. @Secured
Аннотация @Secured ограничивает доступ к методам на основе ролей. В отличие от @PreAuthorize, она не поддерживает SpEL.
Пример:
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;
@Service
public class ReportService {
@Secured("ROLE_ADMIN")
public void generateAdminReport() {
System.out.println("Отчет для администратора");
}
@Secured({"ROLE_USER", "ROLE_MANAGER"})
public void generateUserReport() {
System.out.println("Отчет для пользователя или менеджера");
}
}
Нюансы:
Для использования @Secured необходимо включить метод-базированную безопасность:
@EnableGlobalMethodSecurity(securedEnabled = true)
Роли должны быть указаны с префиксом ROLE_.
#Java #Training #Spring #Security #Security_Annotations
6. @WithMockUser
Используется для создания фиктивного пользователя при тестировании.
Пример:
Нюансы:
Используется только в тестах.
Можно указывать пользователя, роли и пароль для эмуляции различных ситуаций.
7. @EnableGlobalMethodSecurity
Эта аннотация включает поддержку аннотаций на уровне методов, таких как @PreAuthorize, @PostAuthorize, @Secured.
Пример:
Нюансы:
Параметры:
prePostEnabled — включает @PreAuthorize и @PostAuthorize.
securedEnabled — включает @Secured.
jsr250Enabled — включает аннотации JSR-250 (@RolesAllowed).
8. @RolesAllowed
Это аннотация стандарта JSR-250, которая ограничивает доступ к методам на основе ролей.
Пример:
Нюансы:
Требует включения в конфигурации:
9. @CrossOrigin
Эта аннотация позволяет настройку CORS (Cross-Origin Resource Sharing).
Пример:
Нюансы:
Применима для REST API для указания разрешенных доменов.
#Java #Training #Spring #Security #Security_Annotations
Используется для создания фиктивного пользователя при тестировании.
Пример:
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.test.context.support.WithMockUser;
@SpringBootTest
public class MyServiceTest {
@Test
@WithMockUser(username = "testUser", roles = {"USER"})
public void testUserAccess() {
// Тестовый метод, где выполняется проверка с фиктивным пользователем
System.out.println("Тест с пользователем testUser");
}
}
Нюансы:
Используется только в тестах.
Можно указывать пользователя, роли и пароль для эмуляции различных ситуаций.
7. @EnableGlobalMethodSecurity
Эта аннотация включает поддержку аннотаций на уровне методов, таких как @PreAuthorize, @PostAuthorize, @Secured.
Пример:
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class MethodSecurityConfig {
}
Нюансы:
Параметры:
prePostEnabled — включает @PreAuthorize и @PostAuthorize.
securedEnabled — включает @Secured.
jsr250Enabled — включает аннотации JSR-250 (@RolesAllowed).
8. @RolesAllowed
Это аннотация стандарта JSR-250, которая ограничивает доступ к методам на основе ролей.
Пример:
import jakarta.annotation.security.RolesAllowed;
import org.springframework.stereotype.Service;
@Service
public class OrderService {
@RolesAllowed("ROLE_USER")
public void userMethod() {
System.out.println("Метод для пользователей");
}
}
Нюансы:
Требует включения в конфигурации:
@EnableGlobalMethodSecurity(jsr250Enabled = true)
9. @CrossOrigin
Эта аннотация позволяет настройку CORS (Cross-Origin Resource Sharing).
Пример:
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ApiController {
@CrossOrigin(origins = "http://example.com")
@GetMapping("/data")
public String getData() {
return "Data from server";
}
}
Нюансы:
Применима для REST API для указания разрешенных доменов.
#Java #Training #Spring #Security #Security_Annotations