Spring 全家桶之 Spring Security(一)(上)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Spring 全家桶之 Spring Security(一)

Spring Security

Introduction

  Spring Security是基于Spring的安全框架,Spring Security提供全面的安全性解决方案,同时在Web Request和Method处理身份认证和授权,在Spring Framework基础上,Spring Security充分利用了Soring的 DI和AOP特性,为应用系统提供了声明式的安全访问控制功能,是一个轻量级的框架,可以很好的与Spring及Spring MVC集成

核心功能

  1. 认证(Who are you?)
  2. 授权(What you can do?)

原理

  基于Servlet Filter AOP实现认证和授权

Spring Security 最佳实践

使用系统自定义用户及yml中自定义的用户进行登录

  1. 创建Maven项目
  2. 加入依赖,SpringBoot web stater和security-stater


<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-parent</artifactId>
    <version>2.1.5.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

3.创建启动SpringBoot启动类

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

4.创建controller包及Contrller控制器

@RestController
public class HelloSecurityController {
    @GetMapping("/security")
    public String helloSecurity(){
        return "Hello Spring Security!";
    }
}

5.启动SecurityApplication,控制台会生成密码,请看下图所示

da4a3c7c736142669d968aa19b077070_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

浏览器地址栏输入http://localhost:8080/

6dce65d410df465d94cbf40660fda241_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

输入用户名user及控制台生成的密码,即可登录系统访问HelloSecurityController

5b2db89a4cd34d2c9f935874d173ae5c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

如果密码输入错误,则会有相应的提示

ee3730f137f4438589741fe45a771ae6_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

6.以上用户名密码都是由系统自动生成的,如果需要自定义用户名密码则需要在配置文件中进行配置,重新启动,输入设置的用户名密码即可登录

spring:
  security:
    user:
      name: admin
      password: admin

7.关闭登录验证对启动类进行修改,{}中可以放入多个配置类

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
public class SecurityApplication {
    public static void main(String[] args) {
        SpringApplication.run(SecurityApplication.class,args);
    }
}

使用设置在内存中的用户进行登录

  继承WebSecurityConfigurerAdapter,重写configure方法来控制安全管理的内容,将重写的类交由Spring IOC进行管理,可以自定义认证功能,重写是需要使用两个注解@Configuration和@EnableWebSecurity

@Configuration//表示该类是一个配置类,返回值是Java对象,由SpringIOC管理,相当于配置xml文件
@EnableWebSecurity //表示启用SpringSecurity安全框架功能
public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        PasswordEncoder pe = passwordEncoder();
        // 设置内存中用户名和密码
        auth.inMemoryAuthentication().withUser("IronMan").password(pe.encode("12345")).roles();
        auth.inMemoryAuthentication().withUser("SpiderMan").password(pe.encode("12345")).roles();
        auth.inMemoryAuthentication().withUser("Thor").password(pe.encode("thor")).roles();
    }
    // 密码加密类,该类由SpringIOC进行管理,id默认为passwordEncoder
    @Bean
    public PasswordEncoder passwordEncoder(){
        // 实现密码加密
        return new BCryptPasswordEncoder();
    }
}

启动前关闭启动类上的exclude中的内容,启动成功后使用设置的用户名密码进行登录系统,如果改配置类中设置的密码没有加密会报错“java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"”

基于ROLE的身份认证

修改config包中的MyWebSecurityConfig类,给用户设置角色,代码如下:

/**
 * prePostEnabled = true表示可以使用@PreAuthorize注解和@PostAuthorize方法级别的注解
 */
@Configuration//表示该类是一个配置类,返回值是Java对象,由SpringIOC管理,相当于配置xml文件
@EnableWebSecurity //表示启用SpringSecurity安全框架功能
@EnableGlobalMethodSecurity(prePostEnabled = true) //启用方法级别的安全控制
public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        PasswordEncoder pe = passwordEncoder();
        // 设置内存中用户名和密码,并设置角色,一个用户可以有多个角色
        auth.inMemoryAuthentication().withUser("IronMan").password(pe.encode("12345")).roles("admin");
        auth.inMemoryAuthentication().withUser("SpiderMan").password(pe.encode("12345")).roles("user");
        auth.inMemoryAuthentication().withUser("Thor").password(pe.encode("thor")).roles("user","admin");
    }
    // 密码加密类,该类由SpringIOC进行管理,id默认为passwordEncoder
    @Bean
    public PasswordEncoder passwordEncoder(){
        // 实现密码加密
        return new BCryptPasswordEncoder();
    }
}

修改HelloSecurityController,定义角色访问路径

@RestController
public class HelloSecurityController {
    @GetMapping("/security")
    public String sayHello(){
        return "使用内存中的用户信息进行认证";
    }
    //指定user和admin都可以访问的方法
    @GetMapping("/hello")
    @PreAuthorize(value = "hasAnyRole('admin','user')")
    public String helloUserAndAdmin(){
        return "user和admin角色都可以访问";
    }
    @GetMapping("/admin")
    @PreAuthorize(value = "hasAnyRole('admin')")
    public String helloAdmin(){
        return "只有admin可以访问";
    }
}

启动应用,使用IronMan/12345访问/hello

9f8afbf4718f4a4390f37eaed2822bea_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

访问/admin路径

0c2e10f0230a48ce943c606b13eeb160_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

重启tomcat,使用Thor/thor访问/hello

e60c6f89739b4ee890fcafa6767b04fc_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

访问/admin

相关文章
|
4月前
|
安全 Java 数据安全/隐私保护
使用Spring Security实现细粒度的权限控制
使用Spring Security实现细粒度的权限控制
|
4月前
|
安全 Java 数据库
实现基于Spring Security的权限管理系统
实现基于Spring Security的权限管理系统
|
4月前
|
安全 Java 数据安全/隐私保护
解析Spring Security中的权限控制策略
解析Spring Security中的权限控制策略
|
5月前
|
JSON 安全 Java
Spring Security 6.x 微信公众平台OAuth2授权实战
上一篇介绍了OAuth2协议的基本原理,以及Spring Security框架中自带的OAuth2客户端GitHub的实现细节,本篇以微信公众号网页授权登录为目的,介绍如何在原框架基础上定制开发OAuth2客户端。
199 4
Spring Security 6.x 微信公众平台OAuth2授权实战
|
5月前
|
存储 安全 Java
Spring Security 6.x OAuth2登录认证源码分析
上一篇介绍了Spring Security框架中身份认证的架构设计,本篇就OAuth2客户端登录认证的实现源码做一些分析。
224 2
Spring Security 6.x OAuth2登录认证源码分析
|
5月前
|
安全 Java 数据安全/隐私保护
Spring Security 6.x 一文快速搞懂配置原理
本文主要对整个Spring Security配置过程做一定的剖析,希望可以对学习Spring Sercurity框架的同学所有帮助。
251 5
Spring Security 6.x 一文快速搞懂配置原理
|
5月前
|
安全 Java API
Spring Security 6.x 图解身份认证的架构设计
【6月更文挑战第1天】本文主要介绍了Spring Security在身份认证方面的架构设计,以及主要业务流程,及核心代码的实现
82 1
Spring Security 6.x 图解身份认证的架构设计
|
4月前
|
安全 Java 数据安全/隐私保护
使用Spring Security实现细粒度的权限控制
使用Spring Security实现细粒度的权限控制
|
4月前
|
安全 Java 数据安全/隐私保护
使用Java和Spring Security实现身份验证与授权
使用Java和Spring Security实现身份验证与授权
|
4月前
|
存储 安全 Java
Spring Security在企业级应用中的应用
Spring Security在企业级应用中的应用
下一篇
无影云桌面