Java Spring Security认证与授权及注销和权限控制篇综合解析

Java Spring Security认证与授权及注销和权限控制篇综合解析

什么是Java Spring Security?

Spring Security是一个基于Spring框架的安全性框架,目的是为了帮助开发者构建安全性的应用。它提供了诸如认证,授权,攻击防御等安全特性。

认证

Spring Security 认证提供了选择、实现不同的认证方式。本节介绍三种常见的认证方式。

基本认证

基本认证是最简单的认证方式。客户端发起请求时,在“Authorization”头部传递Base64字符串,该字符串是由“username:password”组成,即用户名和密码,服务器根据该字符串来鉴别请求的合法性。

使用Spring Security实现基本认证:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .httpBasic();
}

表单认证

表单认证是Web应用中常见的认证方式。客户端在表单中填写用户名和密码,绑定提交,服务器端验证用户名和密码的正确性。

使用Spring Security实现表单认证:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable() // 禁用 CSRF
        .authorizeRequests()
        .antMatchers("/login").permitAll()
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .loginPage("/login") // 登录页面
        .defaultSuccessUrl("/home")
        .permitAll()
        .and()
        .logout()
        .permitAll();
}

OAuth2.0认证

OAuth2.0是一种认证和授权标准,在应用程序中广泛使用。通过OAuth2.0认证,用户可以使用第三方服务进行登录。使用OAuth2.0认证需要调用第三方API,获取OAuth Token。

使用Spring Security实现OAuth2.0认证:

@Configuration
@EnableWebSecurity
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .oauth2Login();
    }
}

授权

Spring Security 提供了丰富的授权方式,可以提供诸如基于角色、基于权限、ACL等授权特性,可满足各种复杂的授权需求。

基于角色授权

基于角色的授权是指用户通过分配角色来完成授权。系统管理员可以为用户分配角色,用户可以根据自己权限进行操作。

使用Spring Security实现基于角色的授权:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .loginPage("/login")
        .defaultSuccessUrl("/home")
        .permitAll()
        .and()
        .logout()
        .permitAll();
}

基于权限授权

基于权限的授权是指用户通过分配权限来完成授权。系统管理员可以为用户分配权限,用户可以根据自己权限进行操作。

使用Spring Security实现基于权限的授权:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/admin/**").hasAuthority("ADMIN")
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .loginPage("/login")
        .defaultSuccessUrl("/home")
        .permitAll()
        .and()
        .logout()
        .permitAll();
}

注销

注销是将当前用户从系统中退出,Spring Security 提供了注销的实现。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .loginPage("/login")
        .defaultSuccessUrl("/home")
        .permitAll()
        .and()
        .logout()
        .logoutUrl("/logout") // 注销URL
        .logoutSuccessUrl("/login") // 注销成功跳转URL
        .invalidateHttpSession(true)
        .deleteCookies()
        .permitAll();
}

权限控制

Spring Security 还提供了许多其他的功能,例如:权限控制、攻击防御等。

访问控制

对某些资源的访问进行控制,例如:

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

CSRF防护

Spring Security 提供了CSRF防护来防护跨站请求伪造攻击,可以使用csrf().disable()禁用CSRF。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable() // 禁用CSRF
        .authorizeRequests()
        .antMatchers("/login").permitAll()
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .loginPage("/login")
        .defaultSuccessUrl("/home")
        .permitAll()
        .and()
        .logout()
        .permitAll();
}

以上是Spring Security 认证与授权及注销和权限控制篇综合解析。

示例

基本认证

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}


@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
    }
}

使用curl工具请求:

curl --user user:password http://localhost:8080/hello

OAuth2.0认证

@SpringBootApplication
@RestController
@EnableOAuth2Sso
public class ClientApplication {
    @GetMapping("/")
    public String index(Principal principal) {
        return "Hello, " + principal.getName();
    }

    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }
}

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: ***
            client-secret: ***
            scope:
              - email
              - profile
        provider:
          google:
            authorization-uri: https://accounts.google.com/o/oauth2/v2/auth
            token-uri: https://www.googleapis.com/oauth2/v4/token
            user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
            user-name-attribute: name

请求:

浏览器中访问:http://localhost:8080/

可以看到授权页面,确认授权,成功后会返回页面显示用户信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Spring Security认证与授权及注销和权限控制篇综合解析 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • spring-transaction源码分析(3)Transactional事务失效原因

    问题概述 在Transactional方法中使用this方式调用另一个Transactional方法时,拦截器无法拦截到被调用方法,严重时会使事务失效。 类似以下代码: @Transactional public void insertBlogList(List<Blog> blogList) { for (Blog blog : blogLis…

    Java 2023年5月11日
    00
  • c#深拷贝文件夹示例

    当我们需要复制文件夹时,常见的方法是使用递归方式逐一复制文件夹下的所有文件和子文件夹。但是,这种简单的复制方式只是浅拷贝,也就是说,它只是复制了指向文件和文件夹的引用,并没有复制实际的数据。也就是说,如果原始文件夹中的文件被更改或删除,那么复制后的文件夹也会受到影响。这时,我们需要使用深拷贝的方式,即真正地复制文件和文件夹的数据,使得复制后的文件夹与原始文件…

    Java 2023年5月19日
    00
  • JavaCV调用百度AI实现人脸检测方法详解

    JavaCV调用百度AI实现人脸检测方法详解 简介 本文将介绍如何使用JavaCV和百度AI平台实现人脸检测。JavaCV是一个基于OpenCV和FFmpeg库的Java接口。百度AI平台是一个提供机器视觉、语音识别、自然语言处理等人工智能服务的云端平台。通过将JavaCV和百度AI平台相结合,我们可以轻松实现人脸检测功能。 步骤 1. 注册百度AI平台账号…

    Java 2023年5月20日
    00
  • 如何基于java向mysql数据库中存取图片

    当我们需要在Java程序中存储图片文件时,可以将图片以二进制流的形式保存到MySQL数据库中的BLOB字段中。以下是基于Java向MySQL数据库中存取图片的完整攻略: 准备工作 确保已经安装并配置好了MySQL数据库,并创建需要保存图片的表,其列中包含一个BLOB类型的字段用于保存图片,例如: sql CREATE TABLE images ( id IN…

    Java 2023年5月20日
    00
  • Sprint Boot @PostMapping使用方法详解

    @PostMapping是Spring Boot中的一个注解,它用于将HTTP POST请求映射到控制器方法上。在使用Spring Boot开发Web应用程序时,@PostMapping是非常重要的。本文将详细介绍@PostMapping的作用和使用方法,并提供两个示例说明。 @PostMapping的作用 @PostMapping的作用是将HTTP POS…

    Java 2023年5月5日
    00
  • spring jdbctemplate的用法小结

    下面是关于“spring jdbctemplate的用法小结”的完整攻略。 Spring JdbcTemplate的用法小结 概述 Spring JdbcTemplate是Spring框架提供的一个数据访问工具,用于简化JDBC编程。它封装了JDBC API并且提供了一些方便的方法,使得我们可以更加便捷地进行数据库操作。 使用步骤 使用Spring Jdbc…

    Java 2023年5月20日
    00
  • JavaScript 字符串乘法

    当我们需要将一个字符串重复多次时,我们可以使用字符串乘法操作。JavaScript中字符串乘法的语法很简单,就是使用字符串和一个数字相乘,如下所示: string * number 其中,string表示要乘的字符串,number表示要重复的次数。这个操作返回一个新的字符串,是将原字符串重复指定次数后的结果。 下面我们来看两个具体的示例: 示例一 我们有一个…

    Java 2023年5月27日
    00
  • SpringBoot配置的加载流程详细分析

    Spring Boot配置的加载流程详细分析 Spring Boot是一个流行的Java框架,可以帮助开发人员快速构建和部署应用程序。在Spring Boot中,配置文件是非常重要的一部分,它们可以帮助我们配置应用程序的各种属性和行为。在本文中,我们将详细讲解Spring Boot配置的加载流程。 配置文件的加载顺序 Spring Boot支持多种类型的配置…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部