【SpringBoot】最通俗易懂的安全管理机制(Spring Security)

注:本文章基于尚硅谷Springboot高级特性相关视频及资料进行编写,代码简单,较容易理解,若有问题或者源码资料获取可以在评论区留言或者联系作者!

本章代码较多,所以只截取部分代码(尤其是前端页面),可以联系作者获取完整代码;



导引

应用程序两个主要区域:
“认证”:是建立一个他声明的主体的过程(一个”主体“一般指用户,设备或者可以在你的应用程序中执行动作的其它系统)
”授权“:指明确一个主体是否允许在你的应用程序执行一个动作的过程,
这两个主要区域是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 {


    //定制自己的请求授权规则
    @Override
    protected 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“,,每个用户都有对应的两个权限,也就是说,每个用户都只能访问两个权限所对应的路径,运行项目,结果和预想一致;

//定制认证规则

    @Override
    protected 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功能也较为常用,由于篇幅原因,感兴趣的可以联系作者进行相关资源的获取


如果感觉内容写的还不错的话,一键三连不迷路!!!!
后面将会更新更多学习内容,一起学习吧!!!!!!
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Spring框架通过使用依赖注入(DI)来实现解耦。DI允许外部实体在构造函数,字段或者集合属性注入相应的依赖,从而使得类的实例化更加简单,代码更加清晰,维护更加容易。Spring框架实现DI的关键有三个:控制反转(IoC)、面向切面编程(AOP)和依赖查找(DL)。 ### 回答2: Spring框架是一个开源的Java应用开发框架,它使用了依赖注入的原理来管理对象之间的依赖关系。所谓依赖注入,就是让程序员不再需要手动创建和管理对象之间的关系,而是由框架来自动完成。 在Spring框架中,我们首先需要定义好我们的Java类,声明它们之间的依赖关系。我们可以使用注解的方式,在需要依赖的属性或者构造方法上加上注解,告诉框架这个属性或者参数需要注入一个对象。 当我们启动程序的时候,Spring框架会根据我们的配置信息,遍历所有的Java类,解析其中的注解信息。然后会根据这些信息创建一个对象的实例,并且将需要注入的属性或者参数自动赋值。这个过程是通过Java的反射机制来实现的。 具体来说,Spring框架会根据注解上的信息,找到合适的对象实例,然后通过调用对象的构造方法或者设值方法,将实例注入到被依赖的属性或者参数中。这样,我们就完成了对象之间的依赖关系的建立,可以方便地使用它们进行开发和业务处理。 借助依赖注入,我们不再需要手动创建和管理对象之间的依赖关系,大大简化了对象之间的耦合度。我们只需要关注对象的功能实现,而不需要过多关心它的依赖关系。这样可以提高开发效率,同时也方便了程序的维护和修改。 ### 回答3: Spring框架是一个用于简化Java开发的框架,其中的依赖注入是其中的一个核心特性。 依赖注入是将对象之间的依赖关系交由框架来管理,而不是由开发人员手动创建和管理。在Spring中,依赖注入是通过配置文件或注解的方式来实现的。 首先,需要将要注入的类所对应的bean配置为一个Spring的bean,这样框架就能够管理这个对象的生命周期。配置文件通常是一个XML文件,其中包含了对Bean的定义和属性的设置。 接下来,需要在需要注入的类中声明需要注入的属性,并为这些属性提供setter方法。Spring框架在启动时会扫描配置文件,找到需要注入的类,并创建对应的对象。 当需要使用某个对象时,Spring会自动将需要注入的属性通过反射的方式注入到对象中,而不需要开发人员手动创建和设置依赖关系。 通过注入,对象之间的依赖关系被解耦,每个对象只需要关注自己的业务逻辑,而不需要关心如何获取依赖的对象。这样可以提高代码的可维护性和可测试性,并且减少了对象之间的紧耦合。 总的来说,Spring框架的依赖注入是通过配置文件或注解的方式来管理对象之间的依赖关系,框架会自动将需要注入的属性注入到对象中。这样可以简化开发过程,提高代码的可维护性和可测试性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PoJo123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值