Spring Security详解

2023-11-16

一、系统安全

在Web开发中,我们在设计之初就需要考虑系统安全的方面,而不是把功能全部实现完成后,再去考虑。那样的话就会造成两难的境地:一方面,应用会存在严重的漏洞,无法满足用户需求,并可能造成用户信息被攻击者窃取;另一方面,应用的基本架构已经确定,想要修复安全漏洞,可能需要对系统做出较大的调整,因此,耗费大量的人力和物力,因此,我们应该从系统开始做的第一天就应该把安全策略考虑进去,并贯穿在整个应用开发过程中。
目前比较有名的框架有:Shiro,Spring Security
下面我们来了解并实践一下Spring Security

Spring Security官网:https://docs.spring.io/spring-security/site/docs/5.3.13.RELEASE

二、Spring Security简介

Spring Security是一个提供认证、授权和防止常见攻击的框架。

Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

对于上面的情况Spring Security框架都有很好的支持。

在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。

三、案例

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

  • WebSecurityConfigurerAdapter:自定义Security策略
  • AuthenticationManagerBuilder:自定义认证策略
  • @EnableWebSecurity:开启WebSecurity模式

Spring Security的两个主要目标是 “认证” 和 “授权”(访问控制)

“认证”(Authentication)

身份验证是关于验证您的凭据,如用户名/用户ID和密码,以验证您的身份。

“授权” (Authorization)

授权发生在系统成功验证您的身份后,最终会授予您访问资源(如信息,文件,数据库等)的完全权限。

1、新建模块

在这里插入图片描述

2、导入静态资源

在这里插入图片描述

3、编写控制器,实现跳转

@Controller
public class RouterController {

    @RequestMapping({"/", "/index"})
    public String index() {
        return "index";
    }

    @RequestMapping("/toLogin")
    public String toLogin() {
        return "views/login";
    }

    @RequestMapping("/level1/{id}")
    public String level1(@PathVariable("id") int id) {
        return "views/level1/" + id;
    }

    @RequestMapping("/level2/{id}")
    public String level2(@PathVariable("id") int id) {
        return "views/level2/" + id;
    }

    @RequestMapping("/level3/{id}")
    public String level3(@PathVariable("id") int id) {
        return "views/level3/" + id;
    }
}

4、安全功能实现

如果不加入认证和授权功能,我们写的应用是谁都可以访问的,因此我们需要使用Spring Security 增加上认证和授权的功能。
官方文件:https://docs.spring.io/spring-security/site/docs/5.2.15.RELEASE/reference/html5/#jc-authentication

认证和授权

1、编写配置类

    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("cwy").password(new BCryptPasswordEncoder().encode("123123")).roles("vip2","vip3")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123123")).roles("vip1","vip2","vip3")
                .and()
                .withUser("guest").password(new BCryptPasswordEncoder().encode("123123")).roles("vip1");

        //There is no PasswordEncoder mapped for the id "null"

    }

通过内存的方式 创建账户,并且给账户对应的授权角色

权限控制和注销

    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人可以访问,功能页有相应权限才能访问
        //链式编程
        //请求授权的规则
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");

为每一个访问请求分配访问权限,限制用户角色访问。这就是权限控制。
注销功能实现起来也非常简单

        //注销功能
        http.logout().logoutSuccessUrl("/login");

在index页面

<!--注销-->
<a class="item" th:href="@{/logout}">
    <i class="sign-out icon"></i> 注销
</a>

注销后返回登入页面

记住我

 //开启记住我功能
 http.rememberMe().rememberMeParameter("remember" );

在登入界面中

 <div class="field">
     <input type="checkbox" name="remember">记住我
 </div>
 <input type="submit" class="ui blue submit button"/>

记住我功能就是利用cookies来实现的

完整配置类

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     * 授权的
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人可以访问,功能页有相应权限才能访问
        //请求授权的规则
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");

        //没有权限,默认到登录页面
        http.formLogin().loginPage("/tologin").usernameParameter("user").passwordParameter("pwd").loginProcessingUrl("/login");

        //防止网站攻击
        http.csrf().disable();关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求
        //注销功能
        http.logout().logoutSuccessUrl("/login");
        //开启记住我功能
        http.rememberMe().rememberMeParameter("remember" );
    }

    /**
     * 认证的
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    //在内存中定义,也可以再jdbc拿数据
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("cwy").password(new BCryptPasswordEncoder().encode("123123")).roles("vip2","vip3")
                .and()
                .withUser("root").password(new BCryptPasswordEncoder().encode("123123")).roles("vip1","vip2","vip3")
                .and()
                .withUser("guest").password(new BCryptPasswordEncoder().encode("123123")).roles("vip1");

        //There is no PasswordEncoder mapped for the id "null"

    }
}

我们需要结合thymeleaf中的一些功能

sec:authorize=“isAuthenticated()”:是否认证登录!来显示不同的页面

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Security详解 的相关文章

随机推荐

  • UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position ... 问题解决办法之一

    使用Python写文件的时候 或者将网络数据流写入到本地文件的时候 大部分情况下会遇到 UnicodeEncodeError gbk codec can t encode character xa0 in position 这个问题 网络上
  • 不愧是美团内部 “接口自动化测试学习笔记” 这细节讲解,神了

    Lego 美团接口自动化测试实践 1 1接口自动化概述 众所周知 接口自动化测试有着如下特点 1 低投入 高产出 2 比较容 实现自动化 3 和UI自动化测试相比 加稳定 如何做好一个接口自动化测试项目呢 我认为 一个 好的 自动化测试项目
  • Android 13 网络 Adb相关流程深入分析研究

    Android 13 网络 Adb 分析研究 文章目录 Android 13 网络 Adb 分析研究 一 前言 二 默认adb 代码实现 关键 1 修改的目录 2 具体修改 1 在XXX device mk 添加属性 2 设置固定端口号 3
  • 高并发场景下缓存+数据库双写不一致问题分析和解决方案设计

    一 业务场景 库存系统 库存可能会修改 每次修改都要去更新这个缓存 redis 数据 每次库存的数据在缓存中一旦过期 或者是被清理掉了 前端的nginx服务都会发送请求给库存服务 去获取相应的数据 实际上的处理流程没有这么的简单 这里 其实
  • mysql 语句优化的十个经验

    mysql 语句优化的十个经验mysql 语句优化的十个经验 本文算是前一篇 查询语句优化经验总结1的后续 总结了 lt 高性能mysql gt 中与网上常见的一些优化经验中出现的案例进行总结与勘误 但是要注意本文中出现的explain结论
  • anaconda常用命令大全(保姆级别建议收藏)

    一 创建虚拟环境 conda create name env name conda create name env name python 3 6 创建指定python版本 conda create name env name python
  • jmeter分布式压测 linux

    主机master修改 jmeter properties server rmi ssl disable true server port 1099 remote hosts 192 168 36 131 1099 slave分机的ip地址
  • 【python】numpy的array数组与pandas的DataFrame表格互相转换(图文代码超详细)

    目录 0 环境 1 array数组和DataFrame表格的简单介绍 2 转换方式详解 代码 0 前提 需注意 1 array转化为DataFrame 2 DataFrame转化为array 3 完整代码 0 环境 windows jupy
  • WAMP环境隐藏PHP文件实际路径和后缀名

    有时候做客户端开发阶段得测试 需要一个模拟服务器的环境 我使用得最顺手得还是WAMP环境 后台给出的api接口的路径千奇百怪 在WAMP环境中如何模拟这些路径呢 如何将某个路径下的PHP文件映射到另一个URL路径下并隐藏PHP文件后缀呢 在
  • MySQL数据库安装实践 Part 1:单实例部署

    1 MySQL的安装方法介绍 当今的互联网企业中 MySQL数据库大多运行在linux系列操作系统 若应用场景不同 版本不同 MySQL数据库的安装方法也会有区别 下面把常见的几种方法介绍给朋友们 1 1 yum rpm方式安装 MySQL
  • 【zookeeper】raft 共识算法 动画演示 网站

    1 概述 地址 https cyberdak github io thesecretlivesofdatacn raft
  • 中国计算机大会CNCC技术论坛

    第十五届中国计算机大会 CNCC2018 将于 2018 年 10 月 25 27 日在杭州国际博览中心举行 本届大会以 大数据推动数字经济 Big Data Drives the Digital Economy 为主题 探讨计算技术领域最
  • Java-String类的常用方法

    Java String类的常用方法 1 常用方法1 int length 返回字符串的长度 return value length char charAt int index 返回某索引处的字符return value index bool
  • 数据库表字段命名规范

    本文是一篇包含了数据库命名 数据库表命名 数据库表字段命名及SQL语言编码的规范文档 针对研发中易产生的问题和常见错误做了一个整理和修改 为日后涉及到数据库相关的研发工作做好准备 一 数据库命名规范 采用26个英文字母 区分大小写 和0 9
  • 有关深度学习的文章

    https zybuluo com hanbingtao note 485480 https tigerneil gitbooks io neural networks and deep learning zh content chapte
  • OrCAD原理图绘制使用操作

    文章目录 工程的创建 原理图整体设置 调用元器件库 常用元器件库调用 key 一些元器件库介绍 key 常用元器件搜索名 自建元器件库 新建元器件库 新建元器件 绘制元器件管脚设置 key Homogeneous和Heterogeneous
  • 数据结构-树

    目录 树 知识框架 一 树的基本概念 1 树的定义 2 基本术语 3 树的性质 二叉树 一 二叉树的概念 1 二叉树的定义 2 特殊的二叉树 3 二叉树的一些性质 4 二叉树的存储结构 1 顺序存储 2 链式存储 二 二叉树的创建和遍历 1
  • 关于 VTK 7.1.0 + python3.X 的 pycharm 开发环境的搭建

    在此记录一下关于关于 VTK 7 1 0 python3 X 的 pycharm 开发环境的搭建中碰到的问题 一 什么是 VTK 以及支持 python 的版本 VTK visualization toolkit 是一个开源的免费软件系统
  • php7.4安装

    php7 4安装 下载安装编译工具 yum groupinstall Development Tools y 安装依赖包 yum y install libxml2 libxml2 devel openssl openssl devel b
  • Spring Security详解

    Spring Security详解 一 系统安全 二 Spring Security简介 三 案例 1 新建模块 2 导入静态资源 3 编写控制器 实现跳转 4 安全功能实现 认证和授权 权限控制和注销 记住我 一 系统安全 在Web开发中