当前位置:   article > 正文

Springboot安全管理_spring-boot-starter-security

spring-boot-starter-security

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

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <!--<meta name="viewport" content="width=device-width, initial-scale=1,-->
  6. <!--shrink-to-fit=no">-->
  7. <title>番剧详情</title>
  8. </head>
  9. <body >
  10. <a th:href="@{/}">返回</a>
  11. <h1>文豪野犬</h1>
  12. <p style="align-self: auto">
  13. 文豪们的异能之战!
  14. 中岛敦被赶出孤儿院,即将饿死在横滨时,遇到了投河自尽的太宰治。
  15. 敦声称自己一直被猛虎追赶,太宰便借机让其协助武装侦探社找寻“食人虎”。
  16. 最终“食人虎”的真面目令人咋舌,而且此事件的背后竟然隐藏着巨大的阴谋……文豪们的异能力之战,即将打响!
  17. </p>
  18. </body>
  19. </html>

 common/2.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <!--<meta name="viewport" content="width=device-width, initial-scale=1,-->
  6. <!--shrink-to-fit=no">-->
  7. <title>番剧详情</title>
  8. </head>
  9. <body >
  10. <a th:href="@{/}">返回</a>
  11. <h1>间谍过家家</h1>
  12. <p style="align-self: auto">
  13. 每个人都有不可告人的一面——
  14. 这是一个世界各国均暗地里进行激烈情报战的时代。东国(Ostania)与西国(Westalis)的冷战状态已经持续数十年。
  15. “黄昏”是西国情报局东国对策科“WISE”的一名优秀间谍。
  16. 为调查威胁东西两国和平的人物——东国国家统一党总裁多诺万·德斯蒙,上级给予了他一个绝密任务。
  17. 任务名为:“枭”(Strix)行动。
  18. 内容是“一周之内组建家庭,潜入德斯蒙儿子就读的名门学校的联谊会”。
  19. 于是“黄昏”扮演成精神科医生劳埃德·福杰,开始组建家庭。
  20. 然而,他找来的女儿阿尼亚是个能读心的超能力者,妻子约尔是个杀手。三人利害关系一致,便互相隐瞒身份,开始了共同生活。
  21. 世界的和平,就掌握在这意外不断的临时一家人手中
  22. </p>
  23. </body>
  24. </html>

<2>vip/1.html:

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <!--<meta name="viewport" content="width=device-width, initial-scale=1,-->
  6. <!--shrink-to-fit=no">-->
  7. <title>番剧详情</title>
  8. </head>
  9. <body >
  10. <a th:href="@{/}">返回</a>
  11. <h1>黑执事</h1>
  12. <p style="align-self: auto">
  13. 时值19世纪,在英国名门贵族凡多姆海伍家,有一位神秘、优雅、十全十美的执事,他就是“黑执事” 塞巴斯蒂安。
  14. 虽然塞巴斯蒂安总是淡淡地说: “我只是一名执事罢了”,但举止、知识、品味、料理、武术等等没有任何事能难得倒他!
  15. 塞巴斯蒂安的主人,是年仅12岁就位居凡多姆海伍家族的当主——夏尔。
  16. 夏尔不仅只花了短短3年的时间,就让凡多姆公司成为英国最大的零食玩具制造商,更在台面下为女王执行秘密任务,因此又被称为“邪恶贵族”!
  17. 塞巴斯蒂安除了负责照顾夏尔的日常生活起居之外,还得帮成事不足、败事有余的家仆们收拾善后。
  18. 最重要的是,塞巴斯蒂安必须因应夏尔各种任性的要求,优雅达成不可能的任务!
  19. “身为 凡多姆海恩家的执事,怎能连这点小事也办不到?”为了主人夏尔,塞巴斯蒂安将尽心服侍、实现主人所有的愿望。
  20. </p>
  21. </body>
  22. </html>

vip/2.html:

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <!--<meta name="viewport" content="width=device-width, initial-scale=1,-->
  6. <!--shrink-to-fit=no">-->
  7. <title>番剧详情</title>
  8. </head>
  9. <body >
  10. <a th:href="@{/}">返回</a>
  11. <h1>咒术回战</h1>
  12. <p style="align-self: auto">
  13. 咒术回战是大导演朴性厚 竹下良平 筑紫大介 的一部优秀的日韩动漫 类型影视作品,主演有榎木淳弥 内田雄马 濑户麻沙美 。
  14. 影片的关键词是咒术 回战 ,  辛酸、后悔、耻辱——人类诞生的负面感情化作诅咒潜伏于日常当中。
  15. 诅咒是蔓延于世间的灾祸根源,最坏的情况下会导致人死亡。而诅咒,只能通过诅咒来祓除。   拥有惊人身体能力的少年·虎杖悠仁,原本过着普通的高中生活,但某天他为了救下遭到“诅咒”袭击的同伴而吞下了特级咒物“两面宿傩的手指”,自己的魂魄也寄宿了诅咒。自此与身为诅咒的“两面宿傩”共有肉体的虎杖,在最强咒术师五条悟的介绍下编入了对诅咒专门机关「东京都立咒术高等专门学校」……为了祓除诅咒,化身为诅咒的少年无法回头的壮绝物语开始启动——
  16. </p>
  17. </body>
  18. </html>

<3>index.html:

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1,
  6. shrink-to-fit=no">
  7. <title>影視直播亭</title>
  8. <!--<link th:href="@{/login/css/bootstrap.min.css}" rel="stylesheet">
  9. <link th:href="@{/login/css/signin.css}" rel="stylesheet">-->
  10. </head>
  11. <body>
  12. <h1 align="center"> 欢迎进入番剧网站首页</h1>
  13. <div sec:authorize="isAnonymous()">
  14. <h2 align="center"> 游客你好,如果想查看番剧<a th:href="@{/userLogin}"> 请登录</a></h2>
  15. </div>
  16. <div sec:authorize="isAuthenticated()">
  17. <h2 align="center">
  18. <span sec:authentication="name" style="height: 1px"></span>
  19. 您好,你的用户权限为,可以观看以下番剧
  20. <span sec:authentication="principal.authorities" style="height: 1px"></span>
  21. </h2>
  22. <form th:action="@{/myIogout}" method="post">
  23. <input th:type="submit" th:value="注销">
  24. </form>
  25. </div>
  26. <hr>
  27. <div sec:authorize="hasRole(’common’)">
  28. <h3>普通番剧</h3>
  29. <ul>
  30. <li><a th:href="@{/detail/common/1.html}">文豪野犬</a></li>
  31. <img src="mb-4 " th:src="@{/login/img/wenhao.png}" width="100" height="100">
  32. <li><a th:href="@{/detail/common/2.html}">间谍过家家</a></li>
  33. <img src="mb-4 " th:src="@{/login/img/jiandie.png}" width="100" height="100">
  34. </ul>
  35. </div>
  36. <div sec:authorize="hasAuthority(’ROLE_vip’)">
  37. <h3>VIP专享</h3>
  38. <ul>
  39. <li><a th:href="@{/detail/vip/1.html}">黑执事</a></li>
  40. <img src="mb-4 " th:src="@{/login/img/heizhishi.png}" width="100" height="100">
  41. <li><a th:href="@{/detail/vip/2.html}">咒术回战</a></li>
  42. <img src="mb-4 " th:src="@{/login/img/zhoushu.png}" width="100" height="100">
  43. </ul>
  44. </div>
  45. </body>
  46. </html>

3.编写Web控制层

  1. @Controller
  2. public class FilmeController {
  3. // 影片详情页
  4. @GetMapping("/detail/{type}/{path}")
  5. public String toDetail(@PathVariable("type")String type,
  6. @PathVariable("path")String path) {
  7. return "detail/"+type+"/"+path; }}

4.添加spring-boot-starter-security启动器

一旦项目引入spring-boot-starter-security启动器,MVC Security和WebFlux Security负责的安全功能都会立即生效

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. </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配置类:

  1. @EnableWebSecurity
  2. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  3. }

注: @EnableWebSecurity注解是一个组合注解,主要包括@Configuration注解、@Import({WebSecurityConfiguration.class, SpringWebMvcImportSelector.class})注解和@EnableGlobalAuthentication注解

9.使用内存进行身份认证:

SecurityConfig类中重写configure(AuthenticationManagerBuilder auth)方法,并在该方法中使用内存身份认证的方式自定义了认证用户信息。定义用户认证信息时,设置了两个用户名和密码以及对应的角色信息。

  1. @EnableWebSecurity
  2. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  3. @Override
  4. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  5. //加密器
  6. BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
  7. //把密码往内存里存 . 引用加密器 .
  8. auth.inMemoryAuthentication().passwordEncoder(encoder)
  9. //提供用户名 . 密码 . 验证规则
  10. .withUser("haimi").password(encoder.encode("123456")).roles("common")
  11. //加一个用户
  12. .and()
  13. .withUser("海米酱").password(encoder.encode("123456")).roles("vip");
  14. }

10.效果测试:

重启项目进行效果测试,项目启动成功后,仔细查看控制台打印信息,发现没有默认安全管理时随机生成的密码了。通过浏览器访问http://localhost:8082/

输入正确的用户名和密码,会进入网站首页(单击电影名称同样可以查看番剧详情)

 11.数据准备

数据库 springbootdata

<1>t_customer用户表

<2>t_authority用户权限表

 

<3>t_customer_authority用户权限关联表

12.添加JDBC连接数据库的依赖启动器:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jdbc</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.mysql</groupId>
  7. <artifactId>mysql-connector-j</artifactId>
  8. <scope>runtime</scope>
  9. </dependency>

 13.进行数据库连接配置

  1. spring.datasource.url=jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC
  2. spring.datasource.username=root
  3. spring.datasource.password=123456
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 14.使用JDBC进行身份验证

在SecurityConfig 类中的configure(AuthenticationManagerBuilder auth)方法中使用JDBC身份认证的方式进行自定义用户认证,使用JDBC身份认证时,首先需要对密码进行编码设置(必须与数据库中用户密码加密方式一致);然后需要加载JDBC进行认证连接的数据源DataSource;最后,执行SQL语句,实现通过用户名username查询用户信息和用户权限。

  1. @Override
  2. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  3. BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
  4. String userSQL ="select username,password,valid from t_customer "+ "where username = ?";
  5. 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 =?";
  6. auth.jdbcAuthentication().passwordEncoder(encoder).dataSource(dataSource)
  7. .usersByUsernameQuery(userSQL).authoritiesByUsernameQuery(authoritySQL);
  8. }}

15.效果测试

重启项目进行效果测试,项目启动成功后,通过浏览器访问http://localhost:8082/

输入正确的用户名和密码,会进入网站首页(单击电影名称同样可以查看番剧详情)

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/790469
推荐阅读
相关标签
  

闽ICP备14008679号