Spring Boot企业级开发教程

第七章 :Spring Boot   安全管理

1 Spring Security介绍


针对项⽬的安全管理,Spring家族提供了安全框架Spring Security,它是⼀个基于Spring⽣态圈的,⽤于提供安全 访问控制解决⽅案的框架。为了⽅便Spring Boot项⽬的安全管理,Spring Boot对Spring Security安全框架进⾏了 整合⽀持,并提供了通⽤的⾃动化配置,从⽽实现了Spring Security安全框架中包含的多数安全管理功能,下⾯针 对常⻅的安全管理功能进⾏介绍,具体如下。

1.MVC Security是Spring Boot整合Spring MVC搭建Web应⽤的安全管理框架,也是开发中使⽤最多的⼀款安全功 能。
2.WebFlux Security是Spring Boot整合Spring WebFlux搭建Web应⽤的安全管理。虽然Spring 3.WebFlux框架刚出 现不久、⽂档不够健全,但是它集成了其他安全功能的优点,后续有可能在Web开发中越来越流⾏。
4.OAuth2是⼤型项⽬的安全管理框架,可以实现第三⽅认证、单点登录等功能,但是⽬前Spring Boot版本还不⽀ 持OAuth2安全管理框架。
5.Actuator Security⽤于对项⽬的⼀些运⾏环境提供安全监控,例如Health健康信息、Info运⾏信息等,它主要作 为系统指标供运维⼈员查看管理系统的运⾏情况。 


上⾯介绍了Spring Boot整合Spring Security安全框架可以实现的⼀些安全管理功能。项⽬安全管理是⼀个很⼤的 话题,开发者可以根据实际项⽬需求,选择性地使⽤Spring Security安全框架中的功能。

2 Spring Security快速⼊⻔ 


Spring Security的安全管理有两个重要概念,分别是Authentication(认证)和Authorization(授权)。其中,认 证即确认⽤户是否登录,并对⽤户登录进⾏管控;授权即确定⽤户所拥有的功能权限,并对⽤户权限进⾏管控。

2.1开启安全管理效果测试 


在Spring Boot项⽬中开启Spring Security只需要引⼊spring-boot-starter-security启动器即可。下⾯我们在项⽬中 引⼊安全管理依赖,开启项⽬的安全管理并进⾏测试。

2.1.1 添加security启动器

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

3 自定义用户验证

3.1内存身份验证

3.1.1自定义WebSecurityConfigurerAdapter配置类

创建⼀个配置类SecurityConfig。

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

}

@EnableWebSecurity注解是⼀个组合注解,其效果等同于@Import、@EnableGlobalAuthentication、@Configuration的组合⽤法,关于这些注解的介绍具体如下:

@Configuration注解的作⽤是将当前⾃定义的SecurityConfig类作为Spring Boot的配置类。
@lmport注解的作⽤是根据pom.xml中导⼊的Web模块和Security模块进⾏⾃动化配置。
@EnableGlobalAuthentication注解则⽤于开启⾃定义的全局认证。
需要说明的是,如果是针对Spring WebFlux框架的安全⽀持,需要在项⽬中导⼊Reactive Web模块和Security模 块,并使⽤@EnableWebFluxSecurity注解开启基于WebFluxSecurity的安全⽀持。

3.1.2使用内存进行身份验证

在⾃定义的SecurityConfig类中重写configure(AuthenticationManagerBuilder auth)⽅法,并在该⽅法中使⽤内 存身份认证的⽅式进⾏⾃定义⽤户认证。

package com.lzzy.Security.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;


@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        auth.inMemoryAuthentication().passwordEncoder(encoder)
                .withUser("shitou").password(encoder.encode("123456")).roles("common")
                .and()
                .withUser("李四").password(encoder.encode("123456")).roles("vip");
    }

}

在configure(AuthenticationManagerBuilder auth)⽅法中使⽤内存身份认证的⽅式⾃定义了认证⽤户信息。定义⽤户认证信息时,设置了两个⽤户,包括⽤户名、密码和⻆⾊。需要注意以下⼏个问题。

在进行自定义用户认证时,需要注意以下几个问题。

从Spring Security 5开始,⾃定义⽤户认证必须设置密码编码器⽤于保护密码,否则控制台会出现 “IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"”异常错误。
Spring Security提供了多种密码编码器,包括BCryptPasswordEncoder、Pbkdf2PasswordEncoder、 ScryptPasswordEncoder等。
⾃定义⽤户认证时,可以定义⽤户⻆⾊roles,也可以定义⽤户权限authorities。在进⾏赋值时,权限通常是在 ⻆⾊值的基础上添加 ROLE_ 前缀。例如, roles("common") 和 authorities("ROLE_common") 是等效的。
⾃定义⽤户认证时,可以为某个⽤户⼀次指定多个⻆⾊或权限,例如, roles("common", "vip") 或 authorities("ROLE_common", "ROLE_vip") 。
 

3.1.3效果测试

重启项⽬进⾏效果测试,项⽬启动成功后,仔细查看控制台打印信息,发现没有默认安全管理时随机⽣ 成的密码了。 

1.执⾏http://localhost:8080访问项⽬⾸⻚时,同样⾃动跳转到了⽤户登录⻚⾯http://localhost:8080/login。如果 输⼊的⽤户名或者密码错误,会出现相应的错误提示。

2.如果输⼊的⽤户名和密码正确,那么会跳转进⼊⽹站⾸⻚。

实际开发中,⽤户都是在⻚⾯注册和登录时进⾏认证管理的,⽽⾮在程序内部使⽤内存管理的⽅式⼿动控制注册⽤ 户,所以上述使⽤内存身份认证的⽅式⽆法⽤于实际⽣产,只可以作为初学者的测试使⽤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值