Spring Boot 中的 Spring Security 是什么,如何使用

简介: Spring Boot 中的 Spring Security 是什么,如何使用

Spring Boot 中的 Spring Security 是什么,如何使用


在 Web 应用程序中,安全性是非常重要的,因为我们需要保护用户的隐私和数据安全。Spring Boot 提供了一个强大的安全框架,称为 Spring Security,它可以帮助我们保护 Web 应用程序的资源,并提供认证和授权的功能。


本文将介绍 Spring Boot 中的 Spring Security 的基本概念和使用方法,包括如何配置、如何实现认证和授权等。


image.png


Spring Security 的基本概念


Spring Security 是一个基于 Spring 的安全框架,它提供了一组集成的安全性功能,包括认证、授权、加密、会话管理等。它的主要目标是保护 Web 应用程序的资源,防止未经授权的访问和数据泄露。


认证


认证是验证用户身份的过程,通常需要用户提供用户名和密码等凭据。Spring Security 提供了多种认证方式,包括基于表单、HTTP、OAuth2 等。它还支持多种身份验证机制,例如用户名密码、LDAP、数据库等。


授权


授权是验证用户是否有权限访问指定资源的过程。Spring Security 提供了基于角色和权限的授权机制,可以根据用户的角色和权限控制访问资源的级别。


过滤器链


Spring Security 的核心是一个过滤器链,它是一组过滤器的集合,用于处理 Web 请求和响应。每个过滤器都有特定的功能,例如身份验证、授权、会话管理等。Spring Security 的过滤器链是由多个过滤器组成的,其中每个过滤器都有特定的功能。


安全上下文


安全上下文是 Spring Security 的核心组件之一,它包含了当前用户的身份认证信息和授权信息。安全上下文是一个线程本地变量,用于在整个应用程序中传递身份认证和授权信息。


Spring Security 的使用


添加依赖


首先,我们需要在项目的依赖中添加 Spring Security 的依赖:


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

上面的依赖将会自动包含 Spring Security 的必要依赖,并自动配置了 Spring Security 的过滤器链。


配置 Spring Security


Spring Security 的配置可以通过 Java 配置和 XML 配置两种方式实现。在本文中,我们将使用 Java 配置来实现 Spring Security 的配置。


首先,我们需要创建一个继承自 WebSecurityConfigurerAdapter 的配置类,并重写其中的 configure 方法。例如,我们创建一个名为 SecurityConfig 的配置类,代码如下:


@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/")
                .permitAll()
                .and()
            .logout()
                .logoutUrl("/logout")
                .permitAll();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("admin").password("{noop}admin123").roles("ADMIN")
                .and()
                .withUser("user").password("{noop}user123").roles("USER");
    }
}

在上面的配置类中,我们使用 @Configuration 和 @EnableWebSecurity 注解来启用 Spring Security。configure 方法用于配置 Spring Security 的过滤器链,其中:


  • authorizeRequests 方法用于定义访问授权规则,例如 .antMatchers("/admin/**").hasRole("ADMIN") 表示访问 /admin/** 的 URL 需要具有 ADMIN 角色的用户才能访问。
  • anyRequest().authenticated() 表示其他未定义的 URL 需要进行身份认证才能访问。
  • formLogin 方法用于配置表单登录,包括登录页面、默认成功页面等。


logout 方法用于配置注销登录功能。

在上面的配置类中,我们还重写了 configure(AuthenticationManagerBuilder auth) 方法,用于配置用户认证信息。这里我们使用 inMemoryAuthentication() 方法添加了两个用户,分别具有 ADMIN 和 USER 角色。


使用 Spring Security


在上面的配置完成之后,我们就可以使用 Spring Security 保护我们的 Web 应用程序了。例如,我们可以在控制器中使用 @PreAuthorize 注解来限制用户角色和权限的访问:


@Controller
public class HomeController {
    @GetMapping("/")
    public String home() {
        return "home";
    }
    @GetMapping("/admin")
    @PreAuthorize("hasRole('ADMIN')")
    public String admin() {
        return "admin";
    }
    @GetMapping("/user")
    @PreAuthorize("hasAnyRole('ADMIN', 'USER')")
    public String user() {
        return "user";
    }
}

在上面的控制器中,我们使用 @PreAuthorize 注解来限制用户角色和权限的访问。例如,@PreAuthorize("hasRole('ADMIN')") 表示只有具有 ADMIN 角色的用户才能访问该方法。


自定义认证和授权


如果默认的认证和授权方式无法满足我们的需求,我们可以自定义认证和授权。例如,我们可以创建一个实现了 UserDetailsService 接口的服务类来实现自定义认证:


@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException(username);
        }
        return new org.springframework.security.core.userdetails.User(
                user.getUsername(),
                user.getPassword(),
                AuthorityUtils.createAuthorityList(user.getRoles().toArray(new String[0]))
        );
    }
}

在上面的服务类中,我们使用 UserRepository 来查询用户信息,并将用户信息转换为 UserDetails 对象返回。在返回 UserDetails 对象时,我们可以使用 AuthorityUtils.createAuthorityList 方法将用户角色转换为授权列表。


类似地,我们也可以创建一个实现了 AccessDecisionManager 接口的服务类来实现自定义授权:


@Service
public class CustomAccessDecisionManager implements AccessDecisionManager {
    @Override
    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes)
            throws AccessDeniedException, InsufficientAuthenticationException {
        if (configAttributes == null) {
            return;
        }
        for (ConfigAttribute configAttribute : configAttributes) {
            String needRole = configAttribute.getAttribute();
            for (GrantedAuthority grantedAuthority : authentication.getAuthorities()) {
                if (needRole.equals(grantedAuthority.getAuthority())) {
                    return;
                }
            }
        }
        throw new AccessDeniedException("Access is denied");
    }
    @Override
    public boolean supports(ConfigAttribute attribute) {
        return true;
    }
    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }
}

在上面的服务类中,我们使用 AccessDecisionManager 接口的 decide 方法来判断用户是否有访问资源的权限。如果用户具有访问资源的权限,则返回;否则抛出 AccessDeniedException 异常。


总结


本文介绍了 Spring Boot 中的 Spring Security 的基本概念和使用方法,包括认证、授权、过滤器链、安全上下文等。我们还演示了如何使用 Java 配置来配置 Spring Security,并使用 @PreAuthorize 注解来限制用户角色和权限的访问。最后,我们还介绍了如何自定义认证和授权来满足我们的需


相关文章
|
8天前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
181 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
163 0
|
1月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
347 3
|
6月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
319 0
|
6月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
247 0
|
6月前
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
284 0
|
6月前
|
消息中间件 网络协议 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ集成
本文介绍了在 Spring Boot 中集成 ActiveMQ 的详细步骤。首先通过引入 `spring-boot-starter-activemq` 依赖并配置 `application.yml` 文件实现基本设置。接着,创建 Queue 和 Topic 消息类型,分别使用 `ActiveMQQueue` 和 `ActiveMQTopic` 类完成配置。随后,利用 `JmsMessagingTemplate` 实现消息发送功能,并通过 Controller 和监听器实现点对点消息的生产和消费。最后,通过浏览器访问测试接口验证消息传递的成功性。
389 0
|
6月前
|
消息中间件 存储 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装
本教程介绍ActiveMQ的安装与基本使用。首先从官网下载apache-activemq-5.15.3版本,解压后即可完成安装,非常便捷。启动时进入解压目录下的bin文件夹,根据系统选择win32或win64,运行activemq.bat启动服务。通过浏览器访问`http://127.0.0.1:8161/admin/`可进入管理界面,默认用户名密码为admin/admin。ActiveMQ支持两种消息模式:点对点(Queue)和发布/订阅(Topic)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
184 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装