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 注解来限制用户角色和权限的访问。最后,我们还介绍了如何自定义认证和授权来满足我们的需


目录
打赏
0
1
1
1
45
分享
相关文章
|
4月前
|
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
157 0
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
155 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
152 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
微服务——SpringBoot使用归纳——Spring Boot中使用监听器——Spring Boot中自定义事件监听
本文介绍了在Spring Boot中实现自定义事件监听的完整流程。首先通过继承`ApplicationEvent`创建自定义事件,例如包含用户数据的`MyEvent`。接着,实现`ApplicationListener`接口构建监听器,用于捕获并处理事件。最后,在服务层通过`ApplicationContext`发布事件,触发监听器执行相应逻辑。文章结合微服务场景,展示了如何在微服务A处理完逻辑后通知微服务B,具有很强的实战意义。
94 0
微服务——SpringBoot使用归纳——Spring Boot中使用监听器——监听器介绍和使用
本文介绍了在Spring Boot中使用监听器的方法。首先讲解了Web监听器的概念,即通过监听特定事件(如ServletContext、HttpSession和ServletRequest的创建与销毁)实现监控和处理逻辑。接着详细说明了三种实际应用场景:1) 监听Servlet上下文对象以初始化缓存数据;2) 监听HTTP会话Session对象统计在线用户数;3) 监听客户端请求的Servlet Request对象获取访问信息。每种场景均配有代码示例,帮助开发者理解并应用监听器功能。
128 0
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
83 0
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
197 0
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——事务相关
本文介绍Spring Boot事务配置管理,阐述事务在企业应用开发中的重要性。事务确保数据操作可靠,任一异常均可回滚至初始状态,如转账、购票等场景需全流程执行成功才算完成。同时,事务管理在Spring Boot的service层广泛应用,但根据实际需求也可能存在无需事务的情况,例如独立数据插入操作。
55 0
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
127 0
微服务——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)。前者确保每条消息仅被一个消费者消费,后者允许多个消费者同时接收相同消息。
110 0
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ安装