后端进阶之路——综述Spring Security认证,授权(一)

news2024/10/5 20:17:32

前言

在这里插入图片描述
「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站
「推荐专栏」

java一站式服务
前端炫酷代码分享
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说
★ 数据流通的精妙之道★

请添加图片描述

文章目录

  • 前言
  • ✍1. 引言
    • ✌ 背景介绍:网络安全的重要性
    • ✌ Spring Security简介:什么是Spring Security,它的作用和优势
  • ✍2. Spring Security基本概念
      • ✌认证(Authentication):验证用户身份
          • 代码演示
        • 1. 创建一个自定义的 `UserDetailsService` 实现来加载用户信息:
        • 2. 配置 Spring Security 来使用上述的 `UserDetailsService` 实现:
        • 3. 在控制器中处理登录请求:
      • ✌授权(Authorization):授予用户访问权限
          • 代码演示
        • 1. 基于角色(Role)的授权:
        • 2. 基于权限(Permission)的授权:
      • ✌安全上下文(Security Context):保存已认证的用户信息
          • 代码演示
        • 一旦你在认证过程中验证了用户的凭据,你可以创建 `CustomUserDetails` 实例,并将其放入安全上下文中:
      • ✌过滤器链(Filter Chain):处理请求的过程
  • ✍小结

以下是在每个标题前添加#符号后的文本:

✍1. 引言

✌ 背景介绍:网络安全的重要性

网络安全的重要性无法被低估。随着我们越来越依赖互联网和数字技术,网络安全问题变得愈发严峻。以下是网络安全的几个重要方面:

  1. 防止数据泄露:网络安全确保我们的个人信息、敏感数据和商业机密不会落入未授权的人手中。这包括银行账户信息、社交媒体账号、医疗记录等。

  2. 防范黑客攻击:黑客可以通过各种方式入侵网络系统,窃取信息、破坏系统或勒索金钱。网络安全措施有助于防止这些攻击,并保护我们的计算机、移动设备和网络连接。

  3. 维护企业安全:对于企业而言,网络安全至关重要。保护公司的数据和机密信息,防止竞争对手或恶意行为者获取敏感信息,确保业务的连续性和声誉。

  4. 保护个人隐私:在数字时代,我们的个人隐私面临威胁。网络安全可以帮助我们保护个人身份和隐私,避免成为身份盗窃、网络欺诈或网络骚扰的受害者。

  5. 防止网络犯罪:网络安全对于打击网络犯罪至关重要。网络犯罪包括电信诈骗、网络钓鱼、恶意软件传播等。通过加强网络安全,可以降低这些犯罪行为的发生率,并维护社会的安全和秩序。

✌ Spring Security简介:什么是Spring Security,它的作用和优势

Spring Security是一个用于在Java应用程序中实现身份验证和授权的框架。它对应用程序进行保护,以防止未经授权的访问,并确保只有经过身份验证的用户可以执行特定操作。

Spring Security的主要作用是提供全面的安全性解决方案,包括用户认证、授权、会话管理和密码加密等功能。它可以轻松集成到Spring应用程序中,并通过配置和自定义来满足各种安全需求。

以下是Spring Security的几个优点:

  1. 统一的安全管控:Spring Security提供了一套完善的安全管理框架,使得开发者可以方便地集中管理应用程序的安全性,而无需重复编写安全相关的代码。

  2. 灵活的身份验证和授权机制:Spring Security支持多种身份验证方式,如基于表单的身份验证、HTTP Basic和Digest身份验证、LDAP身份验证等。它还提供了细粒度的授权机制,可以通过注解或配置的方式定义权限规则。

  3. 安全性扩展性:Spring Security具有良好的扩展性,可以与其他框架和技术无缝集成,例如Spring框架、OAuth、OpenID等。这使得开发人员可以根据项目需求选择合适的安全性解决方案。

  4. 内置防护措施:Spring Security提供了对常见安全威胁的内置防护机制,如跨站点请求伪造(CSRF)保护、点击劫持保护、会话管理等。这些功能可以有效地提高应用程序的安全性。

在这里插入图片描述

✍2. Spring Security基本概念

Spring Security是一个基于Java的身份验证和访问控制框架,用于保护Web应用程序和服务。它提供了一套功能强大的安全性特性,帮助开发人员在应用程序中实现各种身份验证和授权方案。

在这里插入图片描述

✌认证(Authentication):验证用户身份

认证是确认用户身份的过程。当用户尝试登录系统时,Spring Security会验证用户提供的凭据是否有效,并根据验证结果构建一个代表用户身份的对象,称为Authentication对象。

代码演示

当使用Spring Security进行身份验证时,可以通过以下代码片段来理解认证过程:

1. 创建一个自定义的 UserDetailsService 实现来加载用户信息:

@Service
public class UserDetailsServiceImpl 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("User not found with username: " + username);
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
                getAuthorities(user.getRoles()));
    }

    private Collection<? extends GrantedAuthority> getAuthorities(Set<Role> roles) {
        return roles.stream()
                .map(role -> new SimpleGrantedAuthority(role.getName()))
                .collect(Collectors.toList());
    }
}

2. 配置 Spring Security 来使用上述的 UserDetailsService 实现:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

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

    // 密码加密器
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
                .anyRequest().authenticated()
                .and()
                .formLogin().permitAll()
                .and()
                .logout().permitAll();
    }
}

3. 在控制器中处理登录请求:

@Controller
public class LoginController {

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @GetMapping("/")
    public String home() {
        return "home";
    }
}

在这里插入图片描述

以上代码演示了一个基本的Spring
Security身份验证过程。当用户尝试访问受保护的资源时,会被重定向到登录页面(/login)。用户输入用户名和密码后,Spring
Security将通过 UserDetailsService 加载用户信息,并使用提供的凭据进行验证。如果验证成功,将创建一个
Authentication 对象表示用户身份,并允许用户访问受保护的资源。

✌授权(Authorization):授予用户访问权限

授权是确定用户是否有权限执行某个操作或访问某个资源的过程。Spring Security提供了丰富的授权机制,包括基于角色(Role)和权限(Permission)的授权方式。

代码演示

当涉及到授权时,Spring Security提供了几种常见的授权方式。下面是一些代码片段来帮助理解这些授权机制。

1. 基于角色(Role)的授权:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
            .anyRequest().authenticated()
            .and()
            .formLogin();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("{noop}password").roles("USER")
            .and()
            .withUser("admin").password("{noop}password").roles("ADMIN");
    }
}

在上面的示例中,我们使用了基于角色的授权方式。通过hasRole()hasAnyRole()方法,我们可以指定哪些角色有访问权限。在configureGlobal()方法中,我们使用了一个简单的内存身份验证,其中包含了具有不同角色的两个用户。

2. 基于权限(Permission)的授权:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasAuthority("ADMIN")
            .antMatchers("/user/**").hasAnyAuthority("USER", "ADMIN")
            .anyRequest().authenticated()
            .and()
            .formLogin();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password("{noop}password").authorities("USER")
            .and()
            .withUser("admin").password("{noop}password").authorities("ADMIN");
    }
}

在上面的示例中,我们使用了基于权限的授权方式。通过hasAuthority()hasAnyAuthority()方法,我们可以指定哪些权限有访问权限。在configureGlobal()方法中,我们使用了相同的内存身份验证,但是这次我们分配了不同的权限。

✌安全上下文(Security Context):保存已认证的用户信息

用户详情(User Details):用户详情是Spring Security中表示用户信息的接口,通常由开发人员实现以提供自定义用户信息。它包含用户的用户名、密码、角色等属性。

代码演示

以下是自定义用户详情(User Details)并在安全上下文(Security Context)中保存已认证的用户信息。

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;

public class CustomUserDetails implements UserDetails {
    private String username;
    private String password;
    private Collection<? extends GrantedAuthority> authorities;

    public CustomUserDetails(String username, String password, Collection<? extends GrantedAuthority> authorities) {
        this.username = username;
        this.password = password;
        this.authorities = authorities;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorities;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    // 下面的方法可以根据实际需求进行实现

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

在上述代码中,CustomUserDetails 类实现了 UserDetails
接口,并提供了必要的方法来获取用户名、密码和用户角色等属性。这个类是开发人员自定义的用户详情实现。

一旦你在认证过程中验证了用户的凭据,你可以创建 CustomUserDetails 实例,并将其放入安全上下文中:

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

public class AuthenticationService {
    public void authenticateUser(String username, String password) {
        // 通过验证用户名和密码

        // 创建用户详情
        UserDetails userDetails = new CustomUserDetails(username, password, authorities);

        // 创建认证对象
        Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, password, authorities);

        // 将认证对象放入安全上下文
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }
}

在上述代码中,authenticateUser 方法创建了一个 CustomUserDetails 实例,并使用该实例创建了一个
UsernamePasswordAuthenticationToken
对象。然后,它将认证对象放入安全上下文中,以便后续可以访问已认证的用户信息。

✌过滤器链(Filter Chain):处理请求的过程

过滤器链(Filter Chain):过滤器链是Spring Security的核心组件之一,负责处理请求的安全性。它由多个过滤器组成,每个过滤器负责执行特定的安全操作,例如身份验证、授权检查等。

下面是一个基本的Spring Security过滤器链配置

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .and()
            .logout();
    }
}

在上面的示例中,SecurityConfig类继承了WebSecurityConfigurerAdapter,这是一个方便的基类,用于配置Spring
Security。

configure()方法用于配置HttpSecurity对象,它定义了过滤器链的行为。在该示例中,过滤器链执行以下操作:

  1. authorizeRequests():配置请求授权规则。
  2. .antMatchers("/public/**").permitAll():允许所有用户访问以/public/开头的URL。
  3. .anyRequest().authenticated():对于其他所有请求,要求用户进行身份验证。
  4. .formLogin():启用基于表单的身份验证。
  5. .logout():启用退出功能。

✍小结

Spring Security是一个功能强大的Java框架,用于在应用程序中实现认证(Authentication)和授权(Authorization)功能。它提供了一套细粒度的安全性控制机制,帮助保护应用程序免受恶意攻击和未经授权的访问。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/825910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人脸检测之给照片加上眼镜

人脸检测 文章目录 人脸检测一、背景二、UV空间融合法三、总结与不足四、参考 一、背景 给人脸图像加眼镜在很多领域都有应用。比如修图换造型、眼镜店眼镜试戴、戴眼镜人脸识别等。 给人脸加眼镜的难点在于难以做到自然逼真&#xff0c;且人脸多种多样&#xff0c;角度多变&a…

HCIP——BGP综合实验

BGP综合实验 一、实验拓扑二、实验要求三、实验步骤1、配置接口IP地址与环回地址2、AS2配置OSPF3、配置BGP&#xff0c;建立对等体4、发布路由5、配置路由反射器6、做空接口、汇总以及宣告7、建立GRE隧道8、查看BGP路由表9、测试 一、实验拓扑 二、实验要求 1&#xff0c;AS1存…

关于ETL的两种架构(ETL架构和ELT架构) qt

&#xfeff;ETL&#xff0c;是英文 Extract-Transform-Load 的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform&#xff09;、加载&#xff08;load&#xff09;至目的端的过程。ETL一词较常用在数据仓库&#xf…

Tomcat8安装并启动服务教程

目录 一、安装JDK 1.检查Linux版本信息 2.官网下载jdk 3.将下载的压缩包上传到Linux主机上 4.安装jdk到指定目录 5.配置环境变量 6.检测 二、安装tomcat 1.官网下载tomcat的安装包 2.将下载的包上传到自己的Linux主机上 3.安装tomcat到指定目录 4.为了方便&#xf…

uni-app 微信小程序自定义导航栏

一、效果图 二、导航栏的组成 上面的导航栏主要由状态栏&#xff08;就是手机电量显示栏&#xff09;和小程序的导航栏组成&#xff0c;android手机一般为48px&#xff0c;ios手机一般为44px 三、开发步骤 1、设置navigationStyle:custom {"path": "pages/v…

P2498 [SDOI2012] 拯救小云公主

题目 思路 伊艳二分 这个题比较难的地方就是如何判断在当前r的情况下能否到达终点 我们可以用并查集来判断两个点是否连接&#xff0c;再加两个点&#xff1a;0和n1 代码 #include<bits/stdc.h> using namespace std; #define _p(x) ((x)*(x)) const int maxn3005; co…

三言两语说透koa的洋葱模型

Koa是一个非常轻量化的Node.js web应用框架,其洋葱圈模型是它独特的设计理念和核心实现机制之一。本文将详细介绍Koa的洋葱圈模型背后的设计思想,以及它是如何实现的。 洋葱圈模型设计思想 Koa的洋葱圈模型主要是受函数式编程中的compose思想启发而来的。Compose函数可以将需…

MybatisPlus存在 sql 注入漏洞(CVE-2023-25330)解决办法

首先我们了解下这个漏洞是什么&#xff1f; MyBatis-Plus TenantPlugin 是 MyBatis-Plus 的一个为多租户场景而设计的插件&#xff0c;可以在 SQL 中自动添加租户 ID 来实现数据隔离功能。 MyBatis-Plus TenantPlugin 3.5.3.1及之前版本由于 TenantHandler#getTenantId 方法在…

openEuler22.03安装 filebeat启动失败

报错详情 runtime/cgo: pthread_create failed: Operation not permitted runtime/cgo: pthread_create failed: Operation not permitted SIGABRT: abort PC=0x7faeea51af1f m=8 sigcode=18446744073709551610goroutine 0 [idle]: runtime: unknown pc 0x7faeea51af1f stack:…

pycharm出现python test运行报错(pytest模式)

pycharm出现python test运行报错 一、python test 执行代码报错二、删除运行配置三、修改pycharm默认配置为 unittests四、成功&#xff01; 一、python test 执行代码报错 二、删除运行配置 三、修改pycharm默认配置为 unittests 四、成功&#xff01;

【EI/SCOPUS会议征稿】第三届电气工程与计算机技术国际学术会议(ICEECT 2023)

第三届电气工程与计算机技术国际学术会议 2023 3rd International Conference on Electrical Engineering and Computer Technology 往届均已完成EI、SCOPUS检索 继ICEECT2021、ICEECT2022顺利举办&#xff0c;往届所录用论文均已完成出版及EI核心检索。第三届电气工程与计算…

招投标系统简介 招投标系统源码 java招投标系统 招投标系统功能设计 tbms

&#xfeff;功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&…

Vue引入与Vue拦截原理

1. vue引入 第一种方法&#xff1a;在线引入 <script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 第二种方法&#xff1a;本地引入 2. Vue拦截原理——例题 el用于绑定id&#xff0c;data用于定义数据如下例题 <!DOCTYPE html&…

初学者入门进阶吉他推荐,卡马F1和VEAZEN费森VZ90系列怎么选?详细对比评测,哪一款更符合你的首选!

在新手入门单板吉他圈里&#xff0c;KEPMA卡马F1系列和VEAZEN费森VZ90系列是国内品牌一直都很热销的吉他型号&#xff0c;那么&#xff0c;今天就给大家做一个对比&#xff0c;新手们可以通过各方面评测分析&#xff0c;理性的看看哪把琴适合你买。希望对不知道如何选一把合适吉…

05|Oracle学习(UNIQUE约束)

1. UNIQUE约束介绍 也叫&#xff1a;唯一键约束&#xff0c;用于限定数据表中字段值的唯一性。 1.1 UNIQUE和primary key区别&#xff1a; 主键/联合主键每张表中只有一个。UNIQUE约束可以在一张表中&#xff0c;多个字段中存在。例如&#xff1a;学生的电话、身份证号都是…

三言两语说透柯里化和反柯里化

JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术&#xff0c;可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化的概念、实现原理和应用场景&#xff0c;然后介绍反柯里化的概念、实现原理和应用场景&#xff0c;通过大量的代码示例帮助读…

[SSM]SpringMVC详解

目录 一、SpringMVC简介 1.1什么是MVC 1.2什么是SpringMVC 1.3SpringMVC优点 1.4SpringMVC优化的方向 1.5SpringMVC执行的流程 1.6基于注解的SpringMVC程序 二、SpringMVC注解式开发 2.1RequestMapping定义请求规则 2.1.1指定模块名称 2.1.2对请求提交方式的定义 2…

好用的低代码开发平台是什么样的?

一、好用的低代码开发平台是什么样的&#xff1f; 从企业角度来说&#xff0c;优化流程&#xff0c;提升企业运行效率&#xff1b;节省成本&#xff0c;提高企业效益&#xff1b;维护方便&#xff0c;即改即用&#xff1b;一键升级&#xff0c;方便实用&#xff1b; 从开发者角…

JVM | 从类加载到JVM内存结构

引言 我在上篇文章&#xff1a;JVM | 基于类加载的一次完全实践 中为你讲解如何请“建筑工人”来做一些定制化的工作。但是&#xff0c;大型的Java应用程序时&#xff0c;材料&#xff08;类&#xff09;何止数万&#xff0c;我们直接堆放在工地上&#xff08;JVM&#xff09;…

企业如何有效保护文件传输的安全性

文件传输是现代商业世界中每个企业日常操作的必需品。但是&#xff0c;传统的文件传输方式&#xff0c;如电子邮件和网络共享&#xff0c;并不总是安全可靠。黑客攻击、网络钓鱼和数据泄露等风险时刻存在。因此&#xff0c;企业需要采取措施保障文件传输的安全性。本文将介绍如…