springboot 获取登录浏览器_SpringBoot2系列教程88-SpringBoot整合SpringSecurity实现认证拦截...

SpringBoot2.x系列教程88--SpringBoot整合SpringSecurity实现认证拦截

作者:一一哥

一. SpringSecurity简介

1. SpringSecurity概述

Spring Security 是 Spring 社区的一个顶级项目,也是 Spring Boot 官方推荐使用的安全框架。

除了常规的认证(Authentication)和授权(Authorization)之外,Spring Security还提供了诸如ACLs,LDAP,JAAS,CAS等高级特性以满足复杂场景下的安全需求。

另外,就目前而言,Spring Security和Shiro也是当前广大应用使用比较广泛的两个安全框架。

Spring Security 应用级别的安全主要包含两个主要部分,即登录认证(Authentication)和访问授权(Authorization),首先用户登录的时候传入登录信息,登录验证器完成登录认证并将登录认证好的信息存储到请求上下文,然后再进行其他操作,如在进行接口访问、方法调用时,权限认证器从上下文中获取登录认证信息,然后根据认证信息获取权限信息,通过权限信息和特定的授权策略决定是否授权。

2. SpringSecurity的特征

  • 对身份验证和授权的全面和可扩展的支持;
  • 防止会话固定,点击劫持,跨站点请求伪造等攻击;
  • Servlet API集成;
  • 可选与Spring Web MVC集成。

二. SpringBoot整合SpringSecurity实现步骤

1. 需求分析

当用户来访问接口时,根据用户携带的Authorization去查询此用户的角色,再根据设置好的角色所具有的权限进行判断,如果访问的接口是该角色下的接口,则进行接口放行。

2. 创建web项目

我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。

38dac6f1492db6d87a58788d06bf2499.png

3.先测试不添加SpringSecurity的情况

我们可以先测试一下项目中不添加Spring Security依赖包的情况,在这种情况下,我直接创建一个Controller接口,然后启动项目进行测试。

package 

4. 创建入口类

package 

5.访问接口

此时我们可以看到,在浏览器中可以直接访问这个接口方法。

f53a5cdacc8b4327898058433bbfda9f.png

6. 添加Spring Security依赖包

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

7. 重启项目测试

当添加了spring-boot-starter-security依赖包之后,我们此时再重新启动项目进行测试。

此时会发现控制台中有一行日志信息:也就是Spring Boot会自动产生一个随机的密码。

0bda2b75cf8b1f0e3e7d931a4331c32c.png

然后我们再访问刚才的接口,会发现接口会自动重定向到login登录页面。

然后在这个登录页面中,我们可以输入用户名和密码:

  • 用户名:user
  • 密码:控制台的随机密码

da3a89e4ddc615b46e6988bdd39f4b58.png

然后此时才可以看到刚才的接口内容。

1cb1b3b1cbbf207fe3e6bdcf4020563b.png

这是因为当Spring项目中引入了Spring Security依赖的时候,项目会默认开启如下配置:

security.basic.enabled=true

这个配置开启了一个表单认证,所有服务的访问都必须先过这个认证,默认的用户名为user,密码由Sping Security自动生成,回到IDE的控制台,可以找到密码信息:

Using generated security password: 078db2a5-ae07-4a10-a85c-cf0162a7e966

8. 修改登录表单的用户名和密码

我们可以在application.yml文件中,通过spring.security属性进行用户名和密码的配置。

server:
  port: 8080
spring:
  security:
    user:
      name: admin
      password: 123

此时可以看到,新的登录名和密码变成了我们设置好的。

455f5e4a8b5ea935edf948d3dc883081.png

三. 基于HttpBasic认证

1. HttpBasic认证实现

配置SpringSecurity认证方式。
创建一个配置类SpringSecurityConfig继承org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter这个抽象类并重写configure(HttpSecurity http)方法。

WebSecurityConfigurerAdapter是由Spring Security提供的Web应用安全配置的适配器:

@Configuration

HttpBasic登录效果:

c3d8db5f5233ccf1907c9b692623c11d.png

2. HttpBasic基本原理

上面我们开启了一个最简单的Spring Security安全配置,下面我们来了解下Spring Security的基本原理。通过上面的的配置,代码的执行过程可以简化为下图表示:

49136f0343a4a8f45d320a0ab039096a.png

如上图所示,Spring Security包含了众多的过滤器,这些过滤器形成了一条链,所有请求都必须通过这些过滤器后才能成功访问到资源。

其中UsernamePasswordAuthenticationFilter过滤器用于处理基于表单方式的登录认证,而BasicAuthenticationFilter用于处理基于HTTP Basic方式的登录验证,后面还可能包含一系列别的过滤器(可以通过相应配置开启)。

在过滤器链的末尾是一个名为FilterSecurityInterceptor的拦截器,用于判断当前请求身份认证是否成功,是否有相应的权限,当身份认证失败或者权限不足的时候便会抛出相应的异常。ExceptionTranslateFilter捕获并处理,所以我们在ExceptionTranslateFilter过滤器用于处理了FilterSecurityInterceptor抛出的异常并进行处理,比如需要身份认证时将请求重定向到相应的认证页面,当认证失败或者权限不足时返回相应的提示信息。

四. SpringBoot集成SpringSecurity实现权限管理

我们在上面案例的基础上,进行本案例的开发讲解。

1. 创建实体类

1.1 创建Admin实体类:

package 

1.2 创建Member实体类:

package 

2. 继承WebSecurityConfigurerAdapter配置角色权限

package 

3.创建UserDetailsService

package 

4. 创建controller层代码

4.1 创建AdminController

package 

4.2 创建MemberController

package 

5. 进行测试

此时我们可以利用postman,通过Basic认证方式,携带用户名和密码进行相关接口的访问。

member身份的权限,只能访问member相关的接口:

b2c9c8be3627d8f750f8a3e93d79c174.png

a34c22fd89930bb19f9c5db0cd26d7b4.png

admin身份的权限,可以访问admin与member相关的接口:

05e9118e9ce8a6e77cab636ee5f13904.png

7c2f4bf4a1b7d05c6800f26f449c2c34.png

后续我们可以关联数据库,从数据库中查询用户的身份和角色信息,从而进一步给用户分配权限信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值