当前位置:   article > 正文

SpirngSecurity安全框架 | 狂神学习笔记_狂神security学习笔记

狂神security学习笔记

SpirngSecurity概述

 Spring Security是 Spring 家族中的一个安全管理框架。相比与Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富;

​ Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。

​ Spring Security是一个框架,致力于为Java应用程序提供身份验证授权。与所有Spring项目一样,Spring Security的真正强大之处在于可以轻松扩展以满足自定义要求。

在 Java 生态中,目前有 Spring Security 和 Apache Shiro 两个安全框架,可以完成认证和授权的功能。

为什么要使用SpirngSecurity

在web开发中,安全占据第一位置

我们可以通过一些简单的安全策略,例如过滤器,拦截器保证安全

安全是一个非功能性需求,做网站,后台应该在设计之初进行考虑

就应该把这些东西考虑进去,虽然我们可以通过拦截器,过滤器来完成需求,但是会有大量的原生代码,冗余;而通过SpringSecurity,只需要进行简单的调用,便可实现无数复杂的功能

项目中所涉及的安全性问题

  • 功能权限
  • 访问权限
  • 菜单权限

一般Web应用的需要进行 认证  授权 

  • ​ 认证(Authentication):验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户
  • ​ 授权(Authorization):经过认证后判断当前用户是否有权限进行某个操作

​ 而认证和授权就是SpringSecurity作为安全框架的核心功能。

上手前需知

Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模板默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入spring-boot-starter-security模块,进行少量的配置,即可实现强大的安全管理

需要牢记的几个类

WebSecurityConfigurerAdapter: 自定义Security策略

AuthenticationManagerBuilder: 自定义认证策略

@EnableWebSecurity: 开启WebSecurity模式

案例实战

1、先导入静态资源页面 

2、编写RouterController跳往各个页面

  1. import org.springframework.stereotype.Controller;
  2. import org.springframework.web.bind.annotation.PathVariable;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. @Controller
  5. public class RouterController {
  6. @RequestMapping({"/","/index"})
  7. public String index(){
  8. return "index";
  9. }
  10. @RequestMapping("toLogin")
  11. public String toLogin(){
  12. return "views/login";
  13. }
  14. @RequestMapping("/level1/{id}")
  15. public String level1(@PathVariable("id") int id){
  16. return "views/level1/"+id;
  17. }
  18. @RequestMapping("/level2/{id}")
  19. public String level2(@PathVariable("id") int id){
  20. return "views/level2/"+id;
  21. }
  22. @RequestMapping("/level3/{id}")
  23. public String level3(@PathVariable("id") int id){
  24. return "views/level3/"+id;
  25. }
  26. }

2、SecurityConfig配置SpringSecurity 

configure(HttpSecurity http)是实现授权功能的 什么用户可以访问什么页面

configure(AuthenticationManagerBuilder auth)是实现认证功能的

我们这里案例用的是用户名密码存到缓存里auth.inMemoryAuthentication(),也可以存到数据库 原理的一样的

我们还需要passwordEncoder(new BCryptPasswordEncoder() 对密码进行加密 保证安全

  1. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  2. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  3. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  4. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  5. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  6. //aop
  7. @EnableWebSecurity
  8. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  9. //授权
  10. @Override
  11. protected void configure(HttpSecurity http) throws Exception {
  12. //首页所有人可以访问 里面的功能页只有有权限的人才能访问
  13. http.authorizeRequests().antMatchers("/").permitAll()
  14. .antMatchers("/level1/**").hasRole("vip1")
  15. .antMatchers("/level2/**").hasRole("vip2")
  16. .antMatchers("/level3/**").hasRole("vip3");
  17. //没有权限会到登录页面
  18. http.formLogin().loginPage("/toLogin"); //开启security默认的登录页面 没有权限会跳转这里
  19. //注销.开启了注销功能 .移除所有的cookie.清空所有的 sessiondeleteCookies("remove").invalidateHttpSession(true).
  20. http.logout().logoutSuccessUrl("/");
  21. //开启记住我功能,cookie 默认保存2周
  22. http.rememberMe().rememberMeParameter("remember");
  23. }
  24. //认证
  25. @Override
  26. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  27. auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
  28. .withUser("pzh").password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3") //加密
  29. .and()
  30. .withUser("root").password(new BCryptPasswordEncoder().encode("123456")).roles("vip","vip2","vip3")
  31. .and()
  32. .withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("vip");
  33. }
  34. }

3、让特定身份只能看到特定内容的界面

通过Thymeleaf加SpringSecurity来实现,先导包

这里我们到5版本的,狂神视频导的4版本的,后面容易出bug 

  1. <!--security-thymeleaf-->
  2. <dependency>
  3. <groupId>org.thymeleaf.extras</groupId>
  4. <artifactId>thymeleaf-extras-springsecurity5</artifactId>
  5. <version>3.0.4.RELEASE</version>
  6. </dependency>

在页面引入命名空间

xmlns:th="http://www.thymeleaf.org" xmlns:sec=http://www.thymeleaf.org/extras/spring-security

在html利用sec:authorize="hasRole(‘xxx’)"对权限进行筛选

  1. <!--主容器-->
  2. <div class="ui container">
  3. <div class="ui segment" id="index-header-nav" th:fragment="nav-menu">
  4. <div class="ui secondary menu">
  5. <a class="item" th:href="@{/index}">首页</a>
  6. <!--登录注销-->
  7. <div class="right menu">
  8. <!--如果未登录-->
  9. <div sec:authorize="!isAuthenticated()">
  10. <a class="item" th:href="@{/toLogin}">
  11. <i class="address card icon"></i> 登录
  12. </a>
  13. </div>
  14. <!--如果登录:显示用户名-->
  15. <div sec:authorize="isAuthenticated()">
  16. <a class="item" >
  17. 用户名:<span sec:authentication="name"></span>
  18. <!-- 角色:<span sec:authentication="authorities"></span>-->
  19. </a>
  20. </div>
  21. <!--如果登录:显示注销-->
  22. <div sec:authorize="isAuthenticated()">
  23. <a class="item" th:href="@{/toLogin}">
  24. <i class="sign-out icon"></i> 注销
  25. </a>
  26. </div>
  27. <!--已登录
  28. <a th:href="@{/usr/toUserCenter}">
  29. <i class="address card icon"></i> admin
  30. </a>
  31. -->
  32. </div>
  33. </div>
  34. </div>
  35. <div class="ui segment" style="text-align: center">
  36. <h3>Spring Security Study by 秦疆</h3>
  37. </div>
  38. <div>
  39. <br>
  40. <div class="ui three column stackable grid">
  41. <div class="column" sec:authorize="hasRole('vip1')">
  42. <div class="ui raised segment">
  43. <div class="ui">
  44. <div class="content">
  45. <h5 class="content">Level 1</h5>
  46. <hr>
  47. <div><a th:href="@{/level1/1}"><i class="bullhorn icon"></i> Level-1-1</a></div>
  48. <div><a th:href="@{/level1/2}"><i class="bullhorn icon"></i> Level-1-2</a></div>
  49. <div><a th:href="@{/level1/3}"><i class="bullhorn icon"></i> Level-1-3</a></div>
  50. </div>
  51. </div>
  52. </div>
  53. </div>
  54. <div class="column" sec:authorize="hasRole('vip2')">
  55. <div class="ui raised segment">
  56. <div class="ui" >
  57. <div class="content">
  58. <h5 class="content">Level 2</h5>
  59. <hr>
  60. <div><a th:href="@{/level2/1}"><i class="bullhorn icon"></i> Level-2-1</a></div>
  61. <div><a th:href="@{/level2/2}"><i class="bullhorn icon"></i> Level-2-2</a></div>
  62. <div><a th:href="@{/level2/3}"><i class="bullhorn icon"></i> Level-2-3</a></div>
  63. </div>
  64. </div>
  65. </div>
  66. </div>
  67. <div class="column" sec:authorize="hasRole('vip3')">
  68. <div class="ui raised segment">
  69. <div class="ui">
  70. <div class="content">
  71. <h5 class="content">Level 3</h5>
  72. <hr>
  73. <div><a th:href="@{/level3/1}"><i class="bullhorn icon"></i> Level-3-1</a></div>
  74. <div><a th:href="@{/level3/2}"><i class="bullhorn icon"></i> Level-3-2</a></div>
  75. <div><a th:href="@{/level3/3}"><i class="bullhorn icon"></i> Level-3-3</a></div>
  76. </div>
  77. </div>
  78. </div>
  79. </div>
  80. </div>
  81. </div>
  82. </div>

这样我们就能实现 对应的用户 可以看到对应的界面了

4、开启记住密码功能

  1. //没有权限会到登录页面
  2. http.formLogin().loginPage("/toLogin"); //开启security默认的登录页面 没有权限会跳转这里

在授权类里面加上

  1. //开启记住我功能,cookie 默认保存2周
  2. http.rememberMe().rememberMeParameter("remember");

security自动创建了remember-me的cookie对象,且有效期为14天

5、把默认登录页改成我们自己的

首先去把表单的请求路径改了

<form th:action="@{/toLogin}" method="post">

然后去授权类里面改

  1. //没有权限会到登录页面
  2. http.formLogin().loginPage("/toLogin"); //开启security默认的登录页面 没有权限会跳转这里

这样我们就可以用自己的登录界面了 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/921957
推荐阅读
相关标签
  

闽ICP备14008679号