Spring Security:
Spring Security是基于Spring生态圈的,用于提供安全访问控制解决方案的框架。
Spring Security的安全管理有两个重要概念,分别是Authentication(认证)和Authorization(授权)。
Spring Boot整合Spring Security实现的安全管理功能:
MVC Security是Spring Boot整合Spring MVC框架搭建的Web应用的安全管理。
WebFlux Security是Spring Boot整合Spring WebFlux框架搭建的Web应用的安全管理。
OAuth2是大型项目的安全管理框架,可以实现第三方认证、单点登录等功能。
Actuator Security用于对项目的一些运行环境提供安全监控,例如Health健康信息、Info运行信息等,它主要作为系统指标供运维人员查看管理系统的运行情况。
1.创建Spring Boot项目
创建项目,引入Web和Thymeleaf的依赖启动器:
2.引入页面Html资源文件
在项目的resources下templates目录中,引入案例所需的资源文件,项目结构如下
<1>.common/1.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!--<meta name="viewport" content="width=device-width, initial-scale=1,-->
<!--shrink-to-fit=no">-->
<title>番剧详情</title>
</head>
<body >
<a th:href="@{/}">返回</a>
<h1>文豪野犬</h1>
<p style="align-self: auto">
文豪们的异能之战!
中岛敦被赶出孤儿院,即将饿死在横滨时,遇到了投河自尽的太宰治。
敦声称自己一直被猛虎追赶,太宰便借机让其协助武装侦探社找寻“食人虎”。
最终“食人虎”的真面目令人咋舌,而且此事件的背后竟然隐藏着巨大的阴谋……文豪们的异能力之战,即将打响!
</p>
</body>
</html>
common/2.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!--<meta name="viewport" content="width=device-width, initial-scale=1,-->
<!--shrink-to-fit=no">-->
<title>番剧详情</title>
</head>
<body >
<a th:href="@{/}">返回</a>
<h1>间谍过家家</h1>
<p style="align-self: auto">
每个人都有不可告人的一面——
这是一个世界各国均暗地里进行激烈情报战的时代。东国(Ostania)与西国(Westalis)的冷战状态已经持续数十年。
“黄昏”是西国情报局东国对策科“WISE”的一名优秀间谍。
为调查威胁东西两国和平的人物——东国国家统一党总裁多诺万·德斯蒙,上级给予了他一个绝密任务。
任务名为:“枭”(Strix)行动。
内容是“一周之内组建家庭,潜入德斯蒙儿子就读的名门学校的联谊会”。
于是“黄昏”扮演成精神科医生劳埃德·福杰,开始组建家庭。
然而,他找来的女儿阿尼亚是个能读心的超能力者,妻子约尔是个杀手。三人利害关系一致,便互相隐瞒身份,开始了共同生活。
世界的和平,就掌握在这意外不断的临时一家人手中
</p>
</body>
</html>
<2>vip/1.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!--<meta name="viewport" content="width=device-width, initial-scale=1,-->
<!--shrink-to-fit=no">-->
<title>番剧详情</title>
</head>
<body >
<a th:href="@{/}">返回</a>
<h1>黑执事</h1>
<p style="align-self: auto">
时值19世纪,在英国名门贵族凡多姆海伍家,有一位神秘、优雅、十全十美的执事,他就是“黑执事” 塞巴斯蒂安。
虽然塞巴斯蒂安总是淡淡地说: “我只是一名执事罢了”,但举止、知识、品味、料理、武术等等没有任何事能难得倒他!
塞巴斯蒂安的主人,是年仅12岁就位居凡多姆海伍家族的当主——夏尔。
夏尔不仅只花了短短3年的时间,就让凡多姆公司成为英国最大的零食玩具制造商,更在台面下为女王执行秘密任务,因此又被称为“邪恶贵族”!
塞巴斯蒂安除了负责照顾夏尔的日常生活起居之外,还得帮成事不足、败事有余的家仆们收拾善后。
最重要的是,塞巴斯蒂安必须因应夏尔各种任性的要求,优雅达成不可能的任务!
“身为 凡多姆海恩家的执事,怎能连这点小事也办不到?”为了主人夏尔,塞巴斯蒂安将尽心服侍、实现主人所有的愿望。
</p>
</body>
</html>
vip/2.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!--<meta name="viewport" content="width=device-width, initial-scale=1,-->
<!--shrink-to-fit=no">-->
<title>番剧详情</title>
</head>
<body >
<a th:href="@{/}">返回</a>
<h1>咒术回战</h1>
<p style="align-self: auto">
咒术回战是大导演朴性厚 竹下良平 筑紫大介 的一部优秀的日韩动漫 类型影视作品,主演有榎木淳弥 内田雄马 濑户麻沙美 。
影片的关键词是咒术 回战 , 辛酸、后悔、耻辱——人类诞生的负面感情化作诅咒潜伏于日常当中。
诅咒是蔓延于世间的灾祸根源,最坏的情况下会导致人死亡。而诅咒,只能通过诅咒来祓除。 拥有惊人身体能力的少年·虎杖悠仁,原本过着普通的高中生活,但某天他为了救下遭到“诅咒”袭击的同伴而吞下了特级咒物“两面宿傩的手指”,自己的魂魄也寄宿了诅咒。自此与身为诅咒的“两面宿傩”共有肉体的虎杖,在最强咒术师五条悟的介绍下编入了对诅咒专门机关「东京都立咒术高等专门学校」……为了祓除诅咒,化身为诅咒的少年无法回头的壮绝物语开始启动——
</p>
</body>
</html>
<3>index.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1,
shrink-to-fit=no">
<title>影視直播亭</title>
<!--<link th:href="@{/login/css/bootstrap.min.css}" rel="stylesheet">
<link th:href="@{/login/css/signin.css}" rel="stylesheet">-->
</head>
<body>
<h1 align="center"> 欢迎进入番剧网站首页</h1>
<div sec:authorize="isAnonymous()">
<h2 align="center"> 游客你好,如果想查看番剧<a th:href="@{/userLogin}"> 请登录</a></h2>
</div>
<div sec:authorize="isAuthenticated()">
<h2 align="center">
<span sec:authentication="name" style="height: 1px"></span>
您好,你的用户权限为,可以观看以下番剧
<span sec:authentication="principal.authorities" style="height: 1px"></span>
</h2>
<form th:action="@{/myIogout}" method="post">
<input th:type="submit" th:value="注销">
</form>
</div>
<hr>
<div sec:authorize="hasRole(’common’)">
<h3>普通番剧</h3>
<ul>
<li><a th:href="@{/detail/common/1.html}">文豪野犬</a></li>
<img src="mb-4 " th:src="@{/login/img/wenhao.png}" width="100" height="100">
<li><a th:href="@{/detail/common/2.html}">间谍过家家</a></li>
<img src="mb-4 " th:src="@{/login/img/jiandie.png}" width="100" height="100">
</ul>
</div>
<div sec:authorize="hasAuthority(’ROLE_vip’)">
<h3>VIP专享</h3>
<ul>
<li><a th:href="@{/detail/vip/1.html}">黑执事</a></li>
<img src="mb-4 " th:src="@{/login/img/heizhishi.png}" width="100" height="100">
<li><a th:href="@{/detail/vip/2.html}">咒术回战</a></li>
<img src="mb-4 " th:src="@{/login/img/zhoushu.png}" width="100" height="100">
</ul>
</div>
</body>
</html>
3.编写Web控制层
@Controller
public class FilmeController {
// 影片详情页
@GetMapping("/detail/{type}/{path}")
public String toDetail(@PathVariable("type")String type,
@PathVariable("path")String path) {
return "detail/"+type+"/"+path; }}
4.添加spring-boot-starter-security启动器
一旦项目引入spring-boot-starter-security启动器,MVC Security和WebFlux Security负责的安全功能都会立即生效
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
5.端口号
server.port=8082
6.项目启动测试:
项目启动时会在控制台Console中自动生成一个安全密码
浏览器访问http://localhost:8082/查看项目首页项目中并没有手动创建用户登录页面,而添加了Security依赖后,Spring Security会自带一个默认的登录页面
Security会默认提供一个可登录的用户信息,其中用户名为user,密码随机生成,这个密码会随着项目的每次启动随机生成并打印在控制台上,在登录页面输入用户名和密码
7.开启安全管理效果测试
默认安全管理方式存在的问题:这种默认安全管理方式存在诸多问题,例如: 只有唯一的默认登录用户user、密码随机生成且过于暴露、登录页面及错误提示页面不是我们想要的等。
<1>MVC Security安全配置简介
项目引入spring-boot-starter-security依赖启动器,MVC Security安全管理功能就会自动生效,其默认的安全配置是在SecurityAutoConfiguration和UserDetailsServiceAutoConfiguration中实现的。
<2>如何关闭Sercurity提供的Web应用默认安全配置
要完全关闭Security提供的Web应用默认安全配置,可以自定义WebSecurityConfigurerAdapter类型的Bean组件以及自定义UserDetailsService、AuthenticationProvider或AuthenticationManager类型的Bean组件。
另外,可以通过自定义WebSecurityConfigurerAdapter类型的Bean组件来覆盖默认访问规则。
WebSecurityConfigurerAdapter类的主要方法及说明:
configure(AuthenticationManagerBuilder auth)-------定制用户认证管理器来实现用户认证
configure(HttpSecurity http)-------------------------------定制基于HTTP请求的用户访问控制
8.自定义WebSecurityConfigurerAdapter配置类:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
注: @EnableWebSecurity注解是一个组合注解,主要包括@Configuration注解、@Import({WebSecurityConfiguration.class, SpringWebMvcImportSelector.class})注解和@EnableGlobalAuthentication注解
9.使用内存进行身份认证:
SecurityConfig类中重写configure(AuthenticationManagerBuilder auth)方法,并在该方法中使用内存身份认证的方式自定义了认证用户信息。定义用户认证信息时,设置了两个用户名和密码以及对应的角色信息。
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//加密器
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
//把密码往内存里存 . 引用加密器 .
auth.inMemoryAuthentication().passwordEncoder(encoder)
//提供用户名 . 密码 . 验证规则
.withUser("haimi").password(encoder.encode("123456")).roles("common")
//加一个用户
.and()
.withUser("海米酱").password(encoder.encode("123456")).roles("vip");
}
10.效果测试:
重启项目进行效果测试,项目启动成功后,仔细查看控制台打印信息,发现没有默认安全管理时随机生成的密码了。通过浏览器访问http://localhost:8082/
输入正确的用户名和密码,会进入网站首页(单击电影名称同样可以查看番剧详情)
11.数据准备
数据库 springbootdata
<1>t_customer用户表
<2>t_authority用户权限表
<3>t_customer_authority用户权限关联表
12.添加JDBC连接数据库的依赖启动器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
13.进行数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
14.使用JDBC进行身份验证
在SecurityConfig 类中的configure(AuthenticationManagerBuilder auth)方法中使用JDBC身份认证的方式进行自定义用户认证,使用JDBC身份认证时,首先需要对密码进行编码设置(必须与数据库中用户密码加密方式一致);然后需要加载JDBC进行认证连接的数据源DataSource;最后,执行SQL语句,实现通过用户名username查询用户信息和用户权限。
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String userSQL ="select username,password,valid from t_customer "+ "where username = ?";
String authoritySQL="select c.username,a.authority from t_customer c, "+"t_authority a,t_customer_authority ca where "+"ca.customer_id=c.id and ca.authority_id=a.id and c.username =?";
auth.jdbcAuthentication().passwordEncoder(encoder).dataSource(dataSource)
.usersByUsernameQuery(userSQL).authoritiesByUsernameQuery(authoritySQL);
}}
15.效果测试
重启项目进行效果测试,项目启动成功后,通过浏览器访问http://localhost:8082/
输入正确的用户名和密码,会进入网站首页(单击电影名称同样可以查看番剧详情)
版权归原作者 酒酿小丸子² 所有, 如有侵权,请联系我们删除。