1.什么是安全框架

安全框架就是解决系统安全问题的框架,如果没有安全框架,我们需要手动处理每个资源的访问控制,比较繁琐。使用安全框架,可以通过配置的方式实现对资源的访问限制。

2.SpringSecurity

Spring Security是一个能够为基于Sping的企业应用系统提供声明式的安全访问控制解决方案的高度自定义的安全框架,它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了 Spring IOC,DI(控制反转、依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能呢,减少了安全控制编写大量重复代码的繁琐。

2.1 PasswordEncoder 密码解析器详解

Spring Security 要求容器中必须有 PasswordEncoder 实例。所以当自定义登录逻辑时要求必 须给容器注入 PaswordEncoder 的bean对象。

2.1.1 接口介绍

encode(): 把参数按照特定的解析规则进行解析。

matches() : 验证从存储中获取的编码密码与编码后的提交的原始密码是否匹配。如果密码匹配,则返回true;如果不匹配,则返回false.第一个参数表示需要被解析的密码,第二个参数表示存储的密码。

upgradeEncoding() : 如果解析的密码能够再次进行解析且达到更安全的结则返回true,否则返回false,默认返回false。

2.2.2 BCryptPasswordEncoder 简介

 BCryptPasswordEncoder 是 Spring Security 官方推荐的密码解析器,平时多使用这个解析 器。

BCryptPasswordEncoder 是对 bcrypt 强散列方法的具体实现。是基于Hash算法实现的单向 加密。可以通过strength控制加密强度,默认 10.

2.2 自定义登录逻辑

        当 进 行 自 定 义 登 录 逻 辑 时 需 要 用 到 之 前 讲 解 的 UserDetailsService 和 PasswordEncoder 。但是 Spring Security 要求:当进行自定义登录逻辑时容器内必须有PasswordEncoder实例,所以不能直接new 对象。

2.3自定义登录页面

        虽然 Spring Security 给我们提供了登录页面,但是对于实际项目中,大多喜欢使用自己的登录页面。所以 Spring Security 中不仅仅提供了登录页面,还支持用户自定义登录页面。实现过 程也比较简单,只需要修改配置类即可。

2.3.1编写登录页面

login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head><body><form action="/login" method="post">用户名:<input type="text" name="username" /><br/>密码:<input type="password" name="password" /><br/><input type="submit" value="登录" /></form></body>
</html

2.3.2 修改配置类

   修改配置类中主要设置哪个页面是登录页面,配置类需要继承WebSecurityConfigurerAdapter,并重写 configure 方法。

参数含义:

  • successForwardUrl(): 登录成功后跳转地址
  • loginPage(): 登录页面
  • loginprocessingUrl: 登录页面表单提交地址,次地址可以不真实存在
  • antMatchers(): 匹配内容
  • permitAll(): 允许
    @Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {//表单提交http.formLogin()//自定义登录页面.loginPage("/login.html")//当发现/login时认为是登录,必须和表单提交的地址一样。去执行UserServiceImpl.loginProcessingUrl("/login")//登录成功后跳转页面,POST请求.successForwardUrl("/toMain");http.authorizeRequests()//login.html不需要被认证.antMatchers("/login.html").permitAll()//所有请求都必须被认证,必须登录后被访问.anyRequest().authenticated();//关闭csrf防护http.csrf().disable();}@Beanpublic PasswordEncoder getPw(){return new BCryptPasswordEncoder();}

2.3.3 编写控制器

Controller层

2.4访问控制url匹配

认证中中所有常用配置,主要是对 http.formLogin() 进行操作。而在配置类中 http.authorizeRequests() 主要是对url进行控制,也就是我们所说的授权(访问控制)。

(1).anyRequest()

    anyRequest().authenticated()    其他资源必须登录才能访问

   (2).antMatcher()

在实际项目中经常需要放行所有静态资源

antMatchers("/js/**","/css/**").permitAll() 

 (3).regexMatchers()

使用正则表达式进行匹配。和 antMatchers() 主要的区别就是参数, antMatchers() 参数 是 ant 表达式, regexMatchers() 参数是正则表达式。

.regexMatchers( ".+[.]js").permitAll()       演示所有以.js 结尾的文件都被放行

2.5 内置访问控制方法

(1). permitAll()

        permitAll()表示所匹配的 URL 任何人都允许访问

(2).authenticated()

        authenticated()表示所匹配的 URL 都需要被认证才能访问

(3).anonymous()

        anonymous()表示可以匿名访问匹配的URL。和permitAll()效果类似

(4).denyAll()

        denyAll()表示所匹配的 URL 都不允许被访问

 (5).rememberMe()

        被“remember me”的用户允许访问

2.6 角色权限判断

 (1).hasAuthority(String)

   判断用户是否具有特定的权限,用户的权限是在自定义登录逻辑中创建 User 对象时指定的

在配置类中通过 hasAuthority(“admin”)设置具有 admin 权限时才能访问

 .antMatchers("/main1.html").hasAuthority("admin")

(2). hasAnyAuthority(String ...)

如果用户具备给定权限中某一个,就允许访问。

下面代码中由于大小写和用户的权限不相同,所以用户无权访问

.antMatchers("/main1.html").hasAnyAuthority("adMin","admiN")

(3). hasRole(String)

如果用户具备给定角色就允许访问。否则出现 403。

.antMatchers("/main1.html").hasRole("abc")

(4).hasAnyRole(String ...)

如果用户具备给定角色的任意一个,就允许被访问

(5).hasIpAddress(String)

如果请求是指定的 IP 就运行访问。

.antMatchers("/main1.html").hasIpAddress("127.0.0.1")

2.7 自定义403处理方案

使用 Spring Security 时经常会看见 403(无权限),这对用用户来讲是不友好的。所以Spring Security支持自定义权限受限。

(1).新建类实现 AccessDeniedHandler

@Component
//自定义403(无权限)处理方案
public class MyAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException, ServletException {response.setContentType("application/json;charset=utf-8");request.setCharacterEncoding("utf-8");PrintWriter pw = response.getWriter();String result = "{\"code\":403,\"message\":\"暂无访问权限\"}";pw.write(result);pw.flush();pw.close();}
}

(2).修改配置类

        配置类中重点添加异常处理器。设置访问受限后交给哪个对象进行处理。 myAccessDeniedHandler 是在配置类中进行自动注入的

2.7基于注解的访问控制

在 Spring Security 中提供了一些访问控制的注解。这些注解都是默认是都不可用的,需要通过 @EnableGlobalMethodSecurity (启动类中)进行开启后使用。

这些注解可以写到 Service 接口或方法上,也可以写到 Controller或 Controller 的方法上。通常 情况下都是写在控制器方法上的,控制接口URL是否允许被访问。

 (1).@Secured

        @Secured 是专门用于判断是否具有角色的。能写在方法或类上。参数要以 ROLE_开头

实现过程:  开启注解(启动类)、在控制器方法上添加@Secured (“ROLE_XXX”)注解(注意UserServce实体类中要有ROLE_XXX角色)。

(2).@PreAuthorize/@PostAuthorize

        @PreAuthorize 和@PostAuthorize 都是方法或类级别注解。

@PreAuthorize 表示访问方法或类在执行之前先判断权限,大多情况下都是使用这个注 解,注解的参数和access()方法参数取值相同,都是权限表达式。

@PostAuthorize 表示方法或类执行结束后判断权限,此注解很少被使用到。

  实现过程:开启注解(启动类)、控制器方法(controller层)上添加@PreAuthorize,参数可以是任何 access()支持的表达式。

2.8免登录——RememberMe

Spring Security 中 Remember Me 为“记住我”功能,用户只需要在登录时添加 rememberme复选框,取值为true。Spring Security 会自动把用户信息存储到数据源中,以后就可以不登录进行访问。

(1)添加依赖

(2)配置数据源

在 application.yml 中配置数据源。请确保数据库中已经存在shop数据库。(注意格式规范)

server:port: 8080
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverpassword: xxxxxxxusername: xxxxxxxurl: jdbc:mysql://localhost:3306/security?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai

(3).编写配置

SecurityConfig.java

(4). 在客户端页面添加复选框

在客户端登录页面中添加 remember-me 的复选框,只要用户勾选了复选框下次就不需要进行 登录了。

 (注:html中name的值要和SecurityConfig配置中的值相同)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/login" method="post">用户名:<input type="text" name="userName" /><br/>密码:<input type="password" name="userPwd" /><br/>记住我:<input type="checkbox" name="rmv" value="true"/><br/><input type="submit" value="登录" />
</form>
</body>
</html>

2.9  SpringSecurity中的CSRF

(1).什么是CSR

 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“OneClick Attack” 或者 Session Riding。通过伪造用户请求访问受信任站点的非法请求访问。

跨域:只要网络协议,ip 地址,端口中任何一个不相同就是跨域请求。

(2).Spring Security中的CSRF

从 Spring Security4开始CSRF防护默认开启。默认会拦截请求。进行CSRF处理。CSRF为了保 证不是其他第三方网站访问,要求访问时携带参数名为 _csrf 值为token(token 在服务端产生) 的内容,如果token和服务端的token匹配成功,则正常访问。

安全框架-SpringSecurity相关推荐

  1. DT CMS致力于Spring Boot2.3.5 Vue前后端分离的RBAC权限框架(盛世美颜!)

    文章目录 前言 一.核心技术 二.系统架构 1.模块设计 1.后端模块 2.前端模块 2.安全设计 3.接口设计 三.页面演示 1.登录首页 2.首页展示 3.用户列表 1.用户添加 2.角色分配 4 ...

  2. ssm框架图片上传与显示_SSM在线考试系统

    SSM在线考试系统,简称exam,它是一套基于SpringBoot+SSM+SpringSecurity技术开发的系统. 该系统分为前端和后端,前端学生可以进行测试,后端是数据的维护端.前端技术采用B ...

  3. SpringSecurity以及Oauth2(笔记)

    文章目录 一.简介 1.1 安全框架 1.2 常用安全框架 二.SpringSecurity 2.1 快速开始 2.2 Security的部分源码 2.3 自定义登陆逻辑 2.4 自定义登陆页面 2. ...

  4. 【登录及鉴权】-盘点那些主流的开源登录及权限认证框架 (上)

    登录和鉴权应该是一个完整的系统中几乎必不可少的部分,虽然现在已经有越来越多的框架帮我们简化了这部分工作量,大公司更是有自己专门的登录和权限控制系统,比如阿里的BUC和ACL,开发者仅需要通过简单的步骤 ...

  5. 我写了一套SpringBoot+SpringSecurity+Vue权限系统 实战课程,免费分享给CSDN的朋友们

    大家好,我是锋哥,最近写了一套前后端分离的权限系统,逼格略高,专门为Java初学者提升技术层次和方便就业而精心打造.希望你们喜欢!(文末领取) 一,Java就业实战课程简介: 本课程采用主流的技术栈实 ...

  6. SSO模型及单点登录SSO技术选型

    一.多系统的复杂性 web系统早已从久远的单系统发展成为如今由多系统组成的应用群,面对如此众多的系统,用户难道要一个一个登录.然后一个一个注销吗?就像下图描述的这样 web系统由单系统发展成多系统组成 ...

  7. Springboot搭建个人博客系列

    前言 为什么想要搭建这个博客? 我还记得,在大二寒假的某天,同往常一样的在家解决这某个bug,不停地问度娘,很巧的碰到了一个同行在他的博客中完美的记录了我的bug的解决方案,随后我又看了看他写的其他博 ...

  8. 后端小白的VUE入门笔记, 前端高能慎入

    因为项目需要前后端分离,后端竟然不用控制view层了,页面的跳转后端不再干涉,(前端的vue经过打包后成了一张index.html) 后端只需要响应给前端json串就ok,其实这不是爽歪歪?但是觉得还 ...

  9. 实现安全登录的两种方法

    登录安全--拦截器和过滤器或权限框架的使用 本次我们将采用两种方法实现登录的安全性,首先介绍拦截器和过滤器. 一. 过滤器和拦截器: 过滤器产生的时间/开始工作的时间: 进入Tomcat之后,但是在进 ...

最新文章

  1. Linux_Makefile模板
  2. Linux 2.6内核编译与配置安装升级
  3. BOOST_VMD_ASSERT宏相关的测试程序
  4. 洛谷 - P4197 Peaks(Kruskal重构树+dfs序+主席树)
  5. C语言试题十七之用来求数组的最大元素在数组中的下标并存放在k所指的储存单元中
  6. 2019-02-24-算法-进化
  7. 面向对象基础知识整理
  8. PRML-系列二之2.2
  9. npm命令运行时报错_运行npm update等命令出错后如何分析问题根源(示例代码)
  10. 神奇技术:科学家借助AI从受害人脑中还原犯罪者样貌
  11. 搭建IMXRT1020单片机开发环境(采用MCUXpressoIDE,包括安装SDK)
  12. Office word中去掉首页的页眉
  13. Vite 中 npm run dev 报错 Error: spawn vue3-test2\node_modules\esbuild\esbuild.exe ENOENT
  14. 2021/11/16 Andriod Studio安装经验总结
  15. python怎么解矩阵方程_基于python解线性矩阵方程(numpy中的matrix类)
  16. 锐龙r77700参数 r7 7700功耗 r7 7700核显性能
  17. Oracle数据库练习题(1)
  18. 【java多线程学习】多线程的基本概念
  19. MySQL 字符类型大小
  20. 部署-用Yum安装PHP7.4(CentOS 7.8)

热门文章

  1. python使用IE浏览器
  2. mongdb 下载慢,解决
  3. log4j日志输出性能优化-缓存、异步
  4. maven项目test执行main找不到资源文件
  5. 最简单DIY基于ESP8266的智能彩灯③(在网页用按钮+滑动条+手机APP控制RGB灯)
  6. DFRobot离线语音识别模块真实测评
  7. Geoserver中引用多个图层
  8. 取消SVN感叹号即去除版本库
  9. Azure text-to-speech 语音合成 中文晓晓情感API使用及教程
  10. logo计算机编程简单指令,pc logo 基本绘图命令