程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • SpringSecurity

    • Spring Security是什么
    • 认证与授权的基本概念
      • 1. 什么是认证(Authentication)?
      • 2. 什么是授权(Authorization)?
      • 3. 认证与授权的关系
      • 4. 实际开发中的应用场景
    • Spring Security 的默认配置
    • SpringSecurity的默认登录页
    • Spring Security 的 Filter 机制
    • HttpSecurity 与自定义登录页面
    • Spring Security 的核心组件与扩展
    • Spring Security 中的用户认证与角色管理
    • Spring Security 的授权机制与安全表达式
    • Security 的 Session 与 Token 管理
    • Spring Security 集成第三方登录
    • Spring Security 集成 QQ 登录与 JWT 认证
    • Spring Security 登录认证源码
    • Spring Security - JWT认证实战
    • Spring Security - JWT授权实战
    • Spring Security 异常处理与自定义逻辑
  • SpringSecurity
  • SpringSecurity
scholar
2024-08-20
目录

认证与授权的基本概念

# 认证与授权的基本概念

前言

在任何一个Web应用中,安全问题都绕不开两个核心概念:认证(Authentication) 和 授权(Authorization)。它们是确保应用安全的关键。理解这两个概念及其在Spring Security中的应用,是深入掌握Spring Security的基础。

# 1. 什么是认证(Authentication)?

认证 是指确认用户身份的过程,即“你是谁”。通常在用户登录时完成,通过验证用户名和密码来确认用户的身份。

  • 举例:当用户输入用户名和密码并点击登录按钮时,系统会验证这些信息的真实性,确认用户是否是注册用户。如果认证成功,用户将进入系统,否则会被拒绝访问。

在Spring Security中,认证流程通常由一个AuthenticationManager来处理,它会依次检查用户的凭证(如用户名和密码)是否匹配。

代码示例:简单的用户名密码认证

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()  // 使用内存中的用户信息进行认证
            .withUser("user")  // 设置用户名
            .password("{noop}password")  // 设置密码,这里不进行加密,仅用于演示
            .roles("USER");  // 设置用户角色
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()  // 所有请求都需要认证
            .and()
            .formLogin()  // 启用表单登录
                .permitAll();  // 允许所有用户访问登录页面
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

代码详解:

  • inMemoryAuthentication():这里使用内存中的用户数据进行认证,适合学习和简单的应用测试。生产环境中通常通过数据库进行认证。
  • password("{noop}password"):{noop}表示不加密。在实际应用中,建议使用加密方式存储密码,如BCryptPasswordEncoder。
  • roles("USER"):为用户指定角色,后续授权时会用到。

认证过程:

  1. 用户输入用户名和密码并提交登录请求。
  2. Spring Security的AuthenticationManager验证这些信息。
  3. 验证成功后,生成Authentication对象并存储在SecurityContext中,表明用户已登录。

# 2. 什么是授权(Authorization)?

授权 是指确认经过认证的用户是否有权限访问特定资源,即“你能做什么”。即使用户通过了认证,也并不意味着他可以访问系统中的所有资源。授权根据用户的角色或权限来决定用户可以访问哪些页面或执行哪些操作。

  • 举例:管理员可以访问管理后台并执行管理操作,而普通用户则只能访问前台的部分内容,无法进行管理操作。

在Spring Security中,授权可以基于角色、权限、请求路径、方法等进行细粒度的控制。

代码示例:基于角色的授权控制

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")  // 只有ADMIN角色才能访问/admin开头的路径
            .antMatchers("/user/**").hasRole("USER")    // 只有USER角色才能访问/user开头的路径
            .anyRequest().authenticated()  // 其他所有请求都需要认证
        .and()
        .formLogin()
            .permitAll();  // 允许所有用户访问登录页面
}
1
2
3
4
5
6
7
8
9
10
11

代码详解:

  • antMatchers("/admin/**").hasRole("ADMIN"):这段代码表示,只有具有ADMIN角色的用户才能访问以/admin/开头的路径。类似地,/user/路径只允许USER角色访问。
  • anyRequest().authenticated():表示其他所有请求都需要经过认证,即用户必须登录后才能访问。

授权过程:

  1. 用户成功登录后,系统根据用户的角色或权限判断其是否可以访问某些资源。
  2. 如果用户没有权限访问某个资源,则会返回403(Forbidden)状态码。

# 3. 认证与授权的关系

  • 认证 解决的是“你是谁”的问题,是安全的第一步。
  • 授权 解决的是“你能做什么”的问题,是安全的第二步。

通常,认证与授权是相互依赖的:认证成功后才会进行授权判断,而授权的结果决定了用户能否访问某些资源。

# 4. 实际开发中的应用场景

  • 认证:用户登录、第三方登录(如使用Google、GitHub登录)、单点登录(SSO)等。
  • 授权:基于角色的权限管理(如管理员与普通用户的权限差异)、基于资源的访问控制(如不同用户只能访问自己创建的内容)。

总结:认证与授权是Web应用程序安全管理的核心。Spring Security通过高度可配置的机制,实现了对这两个过程的全面支持,帮助开发者轻松实现复杂的安全需求。理解这两者的关系和作用,是深入学习Spring Security的基础。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Spring Security是什么
Spring Security 的默认配置

← Spring Security是什么 Spring Security 的默认配置→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式