| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring Security -> 正文阅读 |
|
[Java知识库]Spring Security |
目录 Spring Security是一款基于Spring的安全框架,主要包含认证和授权两大安全模块和另外一款流行的安全框架Apache Shiro相比,拥有更为强大的功能。Spring Security可以轻松的自定义扩展以满足各种需求并且对常见的Web安全攻击提供了防护支持。 Spring Boot集成Spring Security创建一个Spring Boot项目,然后引入spring-boot-starter-security,Spring Boot-2.5.3,Spring Security-5.5.1。
创建一个HelloController,对外提供一个:/hello服务
启动项目,访问http://localhost:8080/hello,跳转到一个登陆页面,默认的用户名为user,密码由Sping Security自动生成,IDEA的控制台,可以找到密码信息
输入用户名:user,密码:4f06ba04-37e9-4bdd-a085-3305260da0d6,成功访问/hello接口。 Spring Security自定义用户认证Spring Security支持自定义认证,用自定义的登录页替换默认的登录页、用户信息的获取逻辑、登录成功或失败后的处理逻辑等。 配置自定义登录页 在src/main/resources/resources目录下创建一个login.html(不需要 Controller 跳转)
然后在BrowserSecurityConfig的configure中添加配置
.loginPage("/login.html")指定了跳转到登录页面的请求URL,.loginProcessingUrl("/login")对应登录页面 form表单的action="/login",.antMatchers("/login.html", "/css/", "/error").permitAll()表示跳转到登录页面的请求不被拦截。启动服务,访问http://localhost:8080/hello,会看到页面已经被重定向到了http://localhost:8080/login.html: 配置用户信息的获取逻辑 实现Spring Security提供的UserDetailService接口即可,该接口只有一个抽象方法loadUserByUsername,具体实现如下:
通过以上配置,定义好了一个用户名随机,密码统一为 123456的用户信息。启动项目,访问http://localhost:8080/login,只需要输入任意用户名以及123456作为密码即可登录系统。 Spring Security原理Spring Security默认为开启了一个简单的安全配置,访问http://localhost:8080/hello,Spring Security包含了众多的过滤器,这些过滤器形成了一条链,所有请求都必须通过这些过滤器后才能成功访问到资源。请求来到时先由DelegatingFilterProxy负责接收,然后DelegatingFilterProxy将请求委派给FilterChainProxy进行处理,FilterChainProxy会在doFilterInternal()中生成一个内部类VirtualFilterChain的实例,以此来调用Spring Security 的整条过滤器链。VirtualFilterChain会通过currentPosition依次调用存在additionalFilters中的过滤器。
在DefaultLoginPageGeneratingFilter的doFilter()中,通过isLoginUrlRequest()判定为 true(请求路径是否是/login),直接返回login.html登录页面。当输入用户名和密码,点击Sign in,程序来到AbstractAuthenticationProcessingFilter的doFilter()中,通过requiresAuthentication()判定为 true(是否是 POST 请求),交给其子类UsernamePasswordAuthenticationFilter进行处理,UsernamePasswordAuthenticationFilter会将用户名和密码封装成一个UsernamePasswordAuthenticationToken的实例并进行校验,当校验通过后会将请求重定向到我们一开始请求的路径:/hello。后续对/hello的请求经过过滤器链时就可以一路开绿灯直到最终交由HelloController返回"Hello World"。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 13:19:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |