注:本文章基于尚硅谷Springboot高级特性相关视频及资料进行编写,代码简单,较容易理解,若有问题或者源码资料获取可以在评论区留言或者联系作者!
本章代码较多,所以只截取部分代码(尤其是前端页面),可以联系作者获取完整代码;
应用程序两个主要区域:
“认证”:是建立一个他声明的主体的过程(一个”主体“一般指用户,设备或者可以在你的应用程序中执行动作的其它系统)
”授权“:指明确一个主体是否允许在你的应用程序执行一个动作的过程,
这两个主要区域是Spring Security的两个目标
(1)引入SpringSecurity(导入相关依赖);
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-securityartifactId>
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请求代表登录
* */
(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 页面
* */
这里我们将对前端页面进行管理,使用Security与Thymeleaf整合实现前端页面的管理,实现不同用户权限只能查看固定权限内容的功能;
(1)引入thymeleaf和springsecurity的整合依赖文件
<dependency>
<groupId>org.thymeleaf.extrasgroupId>
<artifactId>thymeleaf-extras-springsecurity5artifactId>
<version>3.0.4.RELEASEversion>
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 heretitle>
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>
<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>
<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>
<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 heretitle>
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功能也较为常用,由于篇幅原因,感兴趣的可以联系作者进行相关资源的获取
如果感觉内容写的还不错的话,一键三连不迷路!!!!
后面将会更新更多学习内容,一起学习吧!!!!!!