【SpringBoot】最通俗易懂的安全管理机制(Spring Security)
注:本文章基于尚硅谷Springboot高级特性相关视频及资料进行编写,代码简单,较容易理解,若有问题或者源码资料获取可以在评论区留言或者联系作者!
本章代码较多,所以只截取部分代码(尤其是前端页面),可以联系作者获取完整代码;
文章目录
- 导引
- 一、、登录&认证&授权
- 二、自定义用户退出
- 三、Security管理前端页面
- 四、记住我功能实现
- 总结:
导引
应用程序两个主要区域:
“认证”:是建立一个他声明的主体的过程(一个”主体“一般指用户,设备或者可以在你的应用程序中执行动作的其它系统)
”授权“:指明确一个主体是否允许在你的应用程序执行一个动作的过程,
这两个主要区域是Spring Security的两个目标
一、、登录&认证&授权
(1)引入SpringSecurity(导入相关依赖);
<!-- 引入SpringSecurity--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
(2)编写Security的配置类
编写配置类MySecurityConfig类继承WebSecurityConfigurerAdapter类,重写它的configure方法,定制自己的请求授权规则;配置不同的用户组权限访问可以访问不同的路径文件
ebSecurityConfigurerAdapter 类的主要方法及说明:
方法 | 描述 |
---|---|
configure(HttpSecurity http) | 定制基于HTTP请求的用户访问控制 |
confiure(AuthenticationManagerBuilder auth) | 定制用户认证管理器来实现用户认证 |
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {//定制自己的请求授权规则@Overrideprotected void configure(HttpSecurity http) throws Exception {//super.configure(http); 这里注解掉父类的授权规则http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/level1/**").hasRole("VIP1").antMatchers("/level2/**").hasRole("VIP2").antMatchers("/level3/**").hasRole("VIP3");//开启自动配置的登录功能http.formLogin().usernameParameter("user").passwordParameter("pwd").loginPage("/userlogin");//规则:/*1、/login来到登录页2、重定向到/login?error表示登录失败3、默认post形式的/login代表处理登录5、一旦定制loginPage;那么loginpage的post请求代表登录* */
(3)运行项目,会发现指定了用户权限的路径会无法访问
(4)添加用户权限
这里添加了三个用户,分别是“zhangsan”,“lisi”,”wangwu“,,每个用户都有对应的两个权限,也就是说,每个用户都只能访问两个权限所对应的路径,运行项目,结果和预想一致;
//定制认证规则@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {// super.configure(auth);auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("zhangsan").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP1","VIP2").and().withUser("lisi").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP2","VIP3").and().withUser("wangwu").password(new BCryptPasswordEncoder().encode("123456")).roles("VIP1","VIP3");}
对于没有访问权限的路径,该用户将不可以访问;
二、自定义用户退出
自定义用户退出主要考虑退出后的会话 如何管理以及跳转到哪个页面,HttpSecurity类的logout()方法用来处理用户退出,它默认处理路径为“/logout"的Post请求,同时也会清除Session和”Remenber Me“等任何默认用户配置。
(1)在配置类中编写配置的注销功能,用户注销成功后,会返回http:localhost:8080主页面
//开启自动 配置的注销功能http.logout().logoutSuccessUrl("/");//指定注销成功后返回首页//规则/** 1、访问/logout表示用户注销,清空session* 2、注销成功会返回/logout?logout 页面* */
(2)退出成功
三、Security管理前端页面
这里我们将对前端页面进行管理,使用Security与Thymeleaf整合实现前端页面的管理,实现不同用户权限只能查看固定权限内容的功能;
(1)引入thymeleaf和springsecurity的整合依赖文件
<!-- 引入thymeleaf和springsecurity的整合依赖--><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity5</artifactId><version>3.0.4.RELEASE</version></dependency>
(2)引入security的名称空间;
xmlns:sec="http://www.thymeleaf.org/extras/spring-security"
在主页面welcome.html页面引入该命名空间;
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head><body>
h1 align="center">欢迎光临武林秘籍管理系统</h1>
<!--如果没有登录-->
<div sec:authorize="!isAuthenticated()"><h2 align="center">游客您好,如果想查看武林秘籍 <a th:href="@{/userlogin}">请登录</a></h2>
</div>
<!--如果登录了-->
<div sec:authorize="isAuthenticated()"><h2><span sec:authentication="name"></span>您好,您的角色有:<span sec:authentication="principal.authorities"></span></h2>
</div><form th:action="@{/logout}" method="post"><input type="submit" value="注销"></input></form>
<!-- 如果有VIP1角色--><div sec:authorize="hasRole('VIP1')"><h3>普通武功秘籍</h3><ul><li><a th:href="@{/level1/1}">罗汉拳</a></li><li><a th:href="@{/level1/2}">武当长拳</a></li><li><a th:href="@{/level1/3}">全真剑法</a></li></ul></div><!-- 如果有VIP2角色--><div sec:authorize="hasRole('VIP2')"><h3>高级武功秘籍</h3><ul><li><a th:href="@{/level2/1}">太极拳</a></li><li><a th:href="@{/level2/2}">七伤拳</a></li><li><a th:href="@{/level2/3}">梯云纵</a></li></ul></div><!-- 如果有VIP3角色--><div sec:authorize="hasRole('VIP3')"><h3>绝世武功秘籍</h3><ul><li><a th:href="@{/level3/1}">葵花宝典</a></li><li><a th:href="@{/level3/2}">龟派气功</a></li><li><a th:href="@{/level3/3}">独孤九剑</a></li></ul></div></body>
通过xmlns:sec引入lSecurity安全标签
sec:authorize="!isAuthenticated()用于判断,如果不是登录的权限用户,将展示的相关信息
sec:authorize="!isAuthenticated()用于判断如果是登录的用户,将展示的相关信息
sec:authorize="hasRole('用户权限')"用于判断用户权限,如果是对应的可访问权限,才可以访问以下信息
(3)运行结果如下所示:
不同权限的用户登录,将会显示不同的页面信息;
四、记住我功能实现
在实际开发中,有些项目会为了用户登录方便还会提供记住我(Remenber Me)功能,如果用户在登录时勾选了记住我选项,那么在一段时间内,将会默认自动登录,并允许访问相关页面,这就免去了重复登录操作的麻烦。
具体流程:登录后将信息以cookie形式保存登录成功后,将cookie发给游览器保存,以后页面访问带上这个cookie。只要通过检查就可以免登陆,点击注销就会删除cookie
(1)在相关登录页面加入记住我选项框:
login.html页面如下所示:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><h1 align="center">欢迎登陆武林秘籍管理系统</h1><hr><div align="center"><form action="/userlogin" method="post">用户名:<input name="user"/><br>密码:<input name="pwd"><br/><input type="checkbox" name="remeber">记住我<br><input type="submit" value="登陆"></form></div>
</body>
</html>
(2)打开MySecurityConfig类,定制记住我功能:
//开启自动配置的记住我功能http.rememberMe().rememberMeParameter("remeber");
注意这里的参数,一定要和前端html页面记住我选项的name值相同;
(3)运行项目,登录时选择记住我选项,关闭页面,然后再次打开页面访问相关权限对应的页面发现能够正常访问,页面也能显示用户信息;说明能够正常运行;
总结:
本次主要讲解了SpringBoot的MVC Security安全管理,并体验了一些SpringBoot默认的安全管理的一些功能,另外还有一个Security的CSRF功能也较为常用,由于篇幅原因,感兴趣的可以联系作者进行相关资源的获取
如果感觉内容写的还不错的话,一键三连不迷路!!!!
后面将会更新更多学习内容,一起学习吧!!!!!!
【SpringBoot】最通俗易懂的安全管理机制(Spring Security)相关推荐
- springboot 2.x升级后出现Spring Security – There is no PasswordEncoder mapped for the id “null”的解决方案
异常描述: java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null&q ...
- springboot 访问html_Spring Boot中使用Spring Security进行安全控制
我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...
- spring-boot重头再来 6 分布式理论 RPC远程过程调用 Zookeeper安装 Dubbo SpringBoot + Dubbo + zookeeper Spring Security
spring-boot重头再来 6 文章目录 spring-boot重头再来 6 分布式理论 RPC远程过程调用 Zookeeper安装 Dubbo dubbo-admin安装 dubbo-admin ...
- SpringBoot 整合Spring Security(简单版)
1 写在前面 关于spring security的介绍,网上一大堆,这里就不介绍了,这里直接使用springboot开始整合 2 整个流程 spring security授权和认证的流程大致和shir ...
- Spring Security:初体验
在上一篇文章中,我们对于Spring Security有了一个基本的了解,那么重点是在Spring Boot中如何使用Spring Security呢? 文章目录 Spring Security初体验 ...
- Spring Security,没有看起来那么复杂(附源码)
权限管理是每个项目必备的功能,只是各自要求的复杂程度不同,简单的项目可能一个 Filter 或 Interceptor 就解决了,复杂一点的就可能会引入安全框架,如 Shiro, Spring Sec ...
- Spring Security 之密码存储
相关文章: OAuth2的定义和运行流程 Spring Security OAuth实现Gitee快捷登录 Spring Security OAuth实现GitHub快捷登录 Spring Secur ...
- Spring Security 自定义资源服务器实践
相关文章: OAuth2的定义和运行流程 Spring Security OAuth实现Gitee快捷登录 Spring Security OAuth实现GitHub快捷登录 Spring Secur ...
- Spring Security Oauth2 token 续期
本文参考以下文章.该文章作者有很多优秀文章,需要的小伙伴可以去看看. Spring Security系列(27)- Spring Security Oauth2之令牌过期和续签问题解决方案(1)_云烟 ...
最新文章
- relay.build调用关系
- 2021年大数据Flink(十七):Flink四大基石
- Metasploit Shell升级Meterpreter会话技巧
- Windows7下手动搭建Apache+PHP+MySQL方法记录
- gilab无法解析php文件,gitlab重新设置域名后就无法访问了。
- 获取焦点改变输入框背景色
- java流数据base64,Base64数据的流解码
- 【数学】稀疏图的随机游走问题
- sql-删除无效sql链接
- java excel 数组公式_教你如何快速学习Excel数组公式及运用
- 爬虫——爬取京东评价
- C++ 求圆的周长和面积
- 统计物理α和β方法体系介绍
- 期末了,用Python写个自动批改作业系统
- Spring实战(第四版)
- 删除 Windows 文件资源管理器左侧 OneDrive 图标
- ZFS-128bit文件系统
- python11.23
- python机械编程入门先学什么_编程入门先学什么
- c语言实现运输问题表上作业法,运输问题的表上作业法
热门文章
- 使用Python实现超级趋势指标(Super Trend Indicator)
- BAV20W规格信息
- 商务咖啡机实力推荐——Barsetto百胜图BAV01咖啡机
- 03 - OAI接入网搭建过程 - 研0
- XenDesktop 连接数据库报错
- lms算法的matlab实现,LMS算法的MATLAB实现
- 2022跨年烟花代码|用Python送你一场跨年烟花秀
- 4路电梯调度——pair program总结
- aspx repeater 用法_ASP.NET-----Repeater数据控件的用法总结(转)
- jop怎么读音英语怎么说_job怎么读?