当前位置: 首页 > news >正文

spring security认证和授权流程

spring security

spring框架中的一个安全框架,它提供了全面的安全解决方案,包括认证

(Authentication)和授权(Authorization)

下面我介绍下spring security认证和授权的流程

认证(Authentication)

认证是确定用户身份的过程,在Spring Security中,认证流程通常涉及以下几个步骤:

a. 请求拦截

当用户尝试访问受保护的资源时,Spring Security的过滤器会拦截请求。

b. 认证请求

表单登录:用户通过提交用户名和密码的表单进行登录

HTTP Basic: 用户通过HTTP Basic认证头发送用户名和密码

OAuth2/OpenID Connect:使用OAuth2或OpenId Connect协议进行认证

JWT(JSON Web Tokens):通过携带JWT令牌进行认证

c. 认证处理

  • UserDetailsService:Spring Security通过UserDetailsService接口加载用户详情。

  • PasswordEncoder:对提交的密码进行加密,并与数据库中的加密密码进行比较。

  • AuthenticationManager:管理认证过程,验证用户名和密码的正确性。

d. 成功与失败

  • 如果认证成功,Authentication对象将被创建并存储在SecurityContextHolder中。

  • 如果认证失败,将抛出AuthenticationException

授权(Authorization)

授权是在用户身份确认后,决定用户是否有权限访问特定资源的过程,授权流程通常涉及以下几个步骤:

a . 访问决策

  • AccessDecisionManager:决定用户是否有权访问受保护的资源。

  • Access Control Lists (ACLs):使用ACLs来控制访问权限。

  • Expression-based access control(使用Spring Security的表达式语言,例如@PreAuthorize注解)。

b. 方法安全性和URL安全性

  • 方法安全性:使用@PreAuthorize@PostAuthorize@Secured等注解在方法上定义安全性。

  • URL安全性:使用Spring Security的配置类或XML配置定义URL访问权限。

使用Java配置方式

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll() // 公开访问的URL
                .anyRequest().authenticated() // 其他所有请求需要认证
            .and()
            .formLogin() // 启用表单登录
                .loginPage("/login") // 自定义登录页面路径
                .permitAll() // 登录页面可公开访问
            .and()
            .logout() // 启用注销功能
                .permitAll(); // 注销功能可公开访问;
    }
 
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication() // 使用内存中的用户存储
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER"); // 定义用户和角色
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(); // 使用BCrypt加密密码
    }
}

相关文章:

  • 对比机器学习揭示了跨物种共享与特异性的脑功能结构|文献速递-医学影像人工智能进展
  • 自动化测试平台ATECLOUD全面解析
  • “文化平权”不再遥远?昆仑万维开源首个面向 AI 短剧创作视频生成模型SkyReels-V1
  • vlanif接口转发vlan
  • 直流稳压电源工作原理_带反馈
  • JAVA过滤器(学习自用)
  • [算法学习笔记]1. 枚举与暴力
  • DeepSeek V3和R1
  • ComfyUI创建自定义节点
  • 分析算法时间复杂度基本方法和步骤
  • 网络安全的态势如何以及如何解决?
  • 【Spring详解一】Spring整体架构和环境搭建
  • 防御保护选路练习
  • 如何优化Spark作业的性能
  • 1-知识图谱-概述和介绍
  • Python变量作用域250218
  • Select、Epoll 与 IOCP模型的介绍与区别
  • 力扣 跳跃游戏 II
  • Pytorch实现之粒子群优化算法在GAN中的应用
  • 【工具类】 Hutool 中用于生成随机数的工具类
  • 俄乌交换205名被俘人员,俄方人员已抵达白俄罗斯
  • 为什么所有动物里,只有人类幼崽发育得这么慢?
  • 最会说亚军感言的鲁德,站上了马德里公开赛的冠军领奖台
  • 三亚回应“买水果9斤变6斤”:反映属实,拟对流动摊贩罚款5万元
  • 结束北京队与总决赛十年之痒的,为何会是一度被群嘲的许利民
  • 力保夏粮丰收,粮食大省江苏多地党政主官到田间察看小麦长势