SpringBoot整合SpringSecurity详解,认证授权从未如此简单

简介: 对于一个Web项目来说,最重要的不是功能酷不酷炫,而是这个项目安不安全。做过项目的人都知道,一个项目在上线前一定会经过安全漏扫,只有通过安全漏扫后这个项目才能正式上线。Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,类似的安全框架还有Shiro。Spring Security主要做两个事情,认证、授权。

点赞再看,养成习惯,听说微信搜公众号《Java鱼仔》会让自己的技术更上一层楼


(一)概述


对于一个Web项目来说,最重要的不是功能酷不酷炫,而是这个项目安不安全。做过项目的人都知道,一个项目在上线前一定会经过安全漏扫,只有通过安全漏扫后这个项目才能正式上线。 Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,类似的安全框架还有Shiro。 Spring Security主要做两个事情,认证、授权。


(二)前期项目搭建


为了更好的展示SpringSecurity,我们先搭建一个简单的web项目出来。引入thymeleaf依赖


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId></dependency><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-java8time</artifactId></dependency>

新建一个登陆页,一个首页,然后几个不同等级的展示页面: login.html

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>登陆页</title></head><body><div><form><h2>登陆页</h2><inputtype="text"id="username"placeholder="username"><inputtype="password"id="password"placeholder="password"><buttontype="button">登陆</button></form></div></body></html>

首页index.html,主要就展示不同等级的按钮,为之后授权做准备

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>首页</title></head><body><div><h2>首页</h2><ahref="/login">登陆</a><divstyle="overflow: hidden"><divstyle="float: left;margin-left: 20px"><h3>level1</h3><ahref="/level1/1">level-1-1</a><hr><ahref="/level1/2">level-1-2</a></div><divstyle="float: left;margin-left: 20px"><h3>level2</h3><ahref="/level2/1">level-2-1</a><hr><ahref="/level2/2">level-2-2</a></div><divstyle="float: left;margin-left: 20px"><h3>level3</h3><ahref="/level3/1">level-3-1</a><hr><ahref="/level3/2">level-3-2</a></div></div></div></body></html>

另外还有几个不同等级的页面


网络异常,图片无法展示
|


分别在body中写上自己对应的编号。


<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body>level-1-1
</body></html>

最后编写一个controller来接收请求:

@ControllerpublicclassRouteController {
@RequestMapping({"/","/index"})
publicStringindex(){
return"index";
    }
@RequestMapping("/login")
publicStringtoLogin(){
return"login";
    }
@RequestMapping("/level1/{id}")
publicStringlevel1(@PathVariable("id")Stringid){
return"level1/"+id;
    }
@RequestMapping("/level2/{id}")
publicStringlevel2(@PathVariable("id")Stringid){
return"level2/"+id;
    }
@RequestMapping("/level3/{id}")
publicStringlevel3(@PathVariable("id")Stringid){
return"level3/"+id;
    }
}

最终的效果如下:

网络异常,图片无法展示
|
首页效果如下:
网络异常,图片无法展示
|


三)认证与授权


在上面的这个页面中有两个问题,第一未做登陆认证的处理,第二三个level页面现在都能被所有人访问,未做授权。而上面的这两个问题都可以通过SpringSecurity来解决。

实现SpringSecurity只需要引入spring-boot-starter-security依赖,进行少量的配置,就可以实现强大的安全管理功能。


在正式接触前我们需要记住几个类:


1.WebSecurityConfigurerAdapter :自定义Security策略


2.AuthenticationManagerBuilder:自定义认证策略


3.@EnableWebSecurity :开启WebSecurity模式


我们新建一个config包,创建一个配置类SecurityConfig,继承WebSecurityConfigurerAdapter接口


@EnableWebSecuritypublicclassSecurityConfigextendsWebSecurityConfigurerAdapter {
//授权@Overrideprotectedvoidconfigure(HttpSecurityhttp) throwsException {
//首页所有人都能访问,level页面只有有权限的人才能访问http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");
//没有权限默认跳到登陆页,默认会重定向到/loginhttp.formLogin();
    }
//认证@Overrideprotectedvoidconfigure(AuthenticationManagerBuilderauth) throwsException {
auth.inMemoryAuthentication()
                .passwordEncoder(newBCryptPasswordEncoder())
                .withUser("root").password(newBCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
                .and()
                .withUser("admin").password(newBCryptPasswordEncoder().encode("123456")).roles("vip1");
    }
}

通过上面的这段代码,实现了授权和认证的功能,其中认证方法在内存中存入的用户信息。正常情况下用户的数据是从数据库中获取,授权功能给不同的页面设置不同的角色。

我们再次打开首页


https://link.juejin.cn/?target=http%3A%2F%2Flocalhost%3A8080%2F%25EF%25BC%258C%25E6%2589%2580%25E6%259C%2589%25E4%25BA%25BA%25E9%2583%25BD%25E6%259C%2589%25E6%259D%2583%25E9%2599%2590%25E7%259C%258B%25E5%2588%25B0%25EF%25BC%258C%25E5%25BD%2593%25E6%2588%2591%25E4%25BB%25AC%25E7%2582%25B9%25E5%2587%25BB%25E9%2587%258C%25E9%259D%25A2%25E7%259A%2584level1


2 3里的链接时,自动跳转到了


https://link.juejin.cn/?target=http%3A%2F%2Flocalhost%3A8080%2Flogin

网络异常,图片无法展示
|


你会发现这个登陆页面明明不是自己写的,怎么就出现了?其实这就是SpringSecurity所提供的,http.formLogin();这段代码做了对登陆页的处理,没有权限默认跳到登陆页,默认会重定向到/login。


当我们用不同权限的账号登陆时,就能点击不同权限的链接,如果点击权限外的链接时,会报403错误


网络异常,图片无法展示
|


(四)注销的操作


既然有认证和授权,那么一定免不了注销的功能,SpringSecurity实现注销很简单,你只需要在SecurityConfig类的授权代码里增加一条代码。


//登出http.logout();

然后在前端index.html代码中增加一个注销的标签

<ahref="/logout">注销</a>

点击首页的注销按钮后就会跳转到SpringSecurity的注销提示界面


网络异常,图片无法展示
|


点击logout按钮后自动退出到登陆页面,如果你希望注销后还是回到首页的话,可以将注销代码修改成下面的方式:

http.logout().logoutSuccessUrl("/");

(五)记住密码功能


一般情况下登陆页面肯定会有一个记住密码的功能,这个功能其实就是在本地生成一个cookie,用原生的java实现虽然不难,但是也需要一定的代码。而使用SpringSecurity只需要一行:

http.rememberMe();

再次进入登陆页面后,就可以看到增加了一行记住密码的选项


网络异常,图片无法展示
|

相关文章
|
1月前
|
安全 Java 数据库
安全无忧!在 Spring Boot 3.3 中轻松实现 TOTP 双因素认证
【10月更文挑战第8天】在现代应用程序开发中,安全性是一个不可忽视的重要环节。随着技术的发展,双因素认证(2FA)已经成为增强应用安全性的重要手段之一。本文将详细介绍如何在 Spring Boot 3.3 中实现基于时间的一次性密码(TOTP)双因素认证,让你的应用安全无忧。
81 5
|
3月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
223 0
|
1月前
|
安全 Java 关系型数据库
springboot整合springsecurity,从数据库中认证
本文介绍了如何在SpringBoot应用中整合Spring Security,并从数据库中进行用户认证的完整步骤,包括依赖配置、数据库表创建、用户实体和仓库接口、用户详情服务类、安全配置类、控制器类以及数据库初始化器的实现。
102 3
springboot整合springsecurity,从数据库中认证
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
30 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
3月前
|
NoSQL 关系型数据库 MySQL
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
143 2
|
3月前
|
安全 Java 数据安全/隐私保护
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
本文介绍了一个基于SpringBoot、Spring Security和JPA开发的校园图书管理系统,包括系统的核心控制器`LoginController`的代码实现,该控制器处理用户登录、注销、密码更新、角色管理等功能,并提供了系统初始化测试数据的方法。
58 0
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
|
3月前
|
安全 Java 数据库
|
3月前
|
JSON 安全 Java
|
3月前
|
安全 Java 关系型数据库
SpringBoot SpringSecurity 介绍(基于内存的验证)
SpringBoot SpringSecurity 介绍(基于内存的验证)
43 0
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
147 1