Spring框架Security(认证)快速上手

2023-10-29

在处理Spring安全框架时,通常可以选择Shiro或者Security,做认证授权加密等。
推荐非SpringBoot,使用Shiro,SpringBoot项目使用Security
学习网址:
Security
Shiro

1.SpringBoot快速装配Security

基础步骤:

引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

重启SpringBoot项目,访问网页,这里使用后台提供的账号密码登录
在这里插入图片描述

实现UserDetailsService

这里开始账号,密码,角色认证(对应User中参数)

@Service
public class DetailService implements UserDetailsService {

    @Autowired
    private PasswordEncoder pe;

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        return new User("xiaoming",pe.encode("666"),new ArrayList<>());
    }
}

选择加密器

这里使用PasswordEncoder做密码加密

  • 把加密器交给Spring管理 (设置配置文件@Bean)

这里使用加密算法BCryptPasswordEncoder
其他加密算法:
BCryptPasswordEncoder
Argon2PasswordEncoder
Pbkdf2PasswordEncoder
SCryptPasswordEncoder(单向加密)
加密器详细


@Configuration
public class SecurityConfig {

    @Bean
    public PasswordEncoder getPasswordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

密码必须加密,否则提示Encoded password does not look like BCrypt

2.认证结合数据库使用

步骤

编写数据库

必须包含账号密码角色

整合Mybatis

编写Entity实体类以及Dao类

注意:由于UserDetailsService返回类型为UserDetails,因此创建的实体类需要实现UserDetails接口

实现UserDetails类重写以下方法。

	private Integer id;
    private String username;
    private String password;
    private String realName;
    private Boolean enabled;
    private Boolean locked;
    private Boolean expired;
    private Boolean credentialsExpired;
    private Date createTime;
    private Date loginTime;
//账号是否过期,0-已过期,1-未过期
    @Override
    public boolean isAccountNonExpired() {
        return this.expired;
    }
    //账号是否被锁定,0-锁定,1-未锁定
    @Override
    public boolean isAccountNonLocked() {
        return this.locked;
    }
    //账号凭证是否过期,0-已过期,1-未过期
    @Override
    public boolean isCredentialsNonExpired() {
        return this.credentialsExpired;
    }
    //账号是否有效,0-失效,1-有效
    @Override
    public boolean isEnabled() {
        return this.enabled;
    }
    //Collection<GrantedAuthority>  authorities,这个属性中存储了这个用户所有的权限
    //暂未使用,后面授权补充
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

重写的方法可以用做封号处理等

修改UserDetailsService

直接找数据库要信息就可以了


@Service
public class DetailService implements UserDetailsService {

    @Autowired
    private PasswordEncoder pe;

    @Autowired
    private SysUserDao sysUserDao;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        SysUser sysUser = sysUserDao.selectByUsername(username);
        return sysUser;
    }
}

注意数据库中密码也必须是PasswordEncoder (使用同样的加密方式)加密过的

前面Security默认将所有URL拦截掉,需要登录认证才能访问URL下面我们把将公开的URL开放供所有人访问

3.给公共URL放行

开启Spring Security Web安全配置

  • 在SecurityConfig中添加注解@EnableWebSecurity
  • SecurityConfig类继承WebSecurityConfigurerAdapter
  1. 控制Spring Security是否使用调试模式(通过注解属性debug指定),缺省为false,表示缺省不使用调试模式;
  2. 导入 WebSecurityConfiguration,用于配置Web安全过滤器FilterChainProxy;
  3. 如果是Servlet 环境,导入WebMvcSecurityConfiguration;
  4. 如果是OAuth2环境,导入OAuth2ClientConfiguration;
  5. 使用注解@EnableGlobalAuthentication启用全局认证机制;

编辑资源拦截配置与开放URL权限

在这里插入图片描述

重写

configure(HttpSecurity http)

先观察原本的configure(HttpSecurity http) 方法如下。
在这里插入图片描述
重写放权

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/hello").permitAll()//所有人可以访问
                .anyRequest().authenticated();//配置所有路径只有登录才可以访问

        http.formLogin();//开启表单登录
        http.httpBasic();
    }

到这里已经成功放行了
下面简单记录一下几种主要配置

URL匹配常用的几种方式

  1. requestMatchers() 配置一个request Mather数组,参数为RequestMatcher 对象,其match 规则自定义,需要的时候放在最前面,对需要匹配的的规则进行自定义与过滤
  2. antMatchers() 配置一个request Mather 的 string数组,参数为 ant 路径格式, 直接匹配url
  3. anyRequest 匹配任意url,无参,必须放在最后面

URL权限
permitAll() 已登录和未登录用户都能访问
authenticated() 已登录用户能访问,未登录用户不能访问
anonymous() 未登录用户能访问,已登录用户不能访问
denyAll() 已登录和未登录用户都不能访问
rememberMe() 通过“记住我”功能直接登录的用户可以访问
fullyAuthenticated() 不是通过“记住我”功能直接登录的用户可以访问

登录login配置
1.formLogin() 配置基于表单登录的认证方式
loginPage() 登录页地址,默认“/login”
loginProcessingUrl 提交表单之后真正处理登录请求的地址
defaultSuccessUrl 默认跳转到 Referer 来源页面,如果 Referer 为空,没有来源页,则跳转到默认设置的页面
successForwardUrl 登录后一律跳转到指定的地址
failuerUrl登录失败之后系统转向的url,默认是loginPage + “?error”
failuerHandler登录失败之后的处理器
successHandler登录成功之后的处理器
2.httpBasic() 配置Http Basic认证方式
了解httpBasic

登出logout配置
logout() 配置登出
logoutUrl 登出url,默认是/logout
logoutSuccessUrl 登出成功后跳转的 url 默认是"/login?logout"
logoutSuccessHandler 登出成功处理器,设置后会把logoutSuccessUrl 置为null

4.自定义登录界面

  • 添加自己的登录界面
    注意两个地方
    在这里插入图片描述
  • 放开权限
  • 按照上面登录login配置来配置跳转跟传参地址
    在这里插入图片描述
  • 关闭csrf或者在登录表单增加csrf字段
    注意:

如果这里运行访问http://localhost:8080/myLogin.html后台不报错,但是网页报
*This application has no explicit mapping for /error, so you are seeing this as a fallback. Mon May 09 17:03:35 CST 2022 There was an unexpected error (type=Not Found, status=404). No message available*
不必惊慌,有可能原因是:

  1. 你的Application运行类位置放错了,所有包的外面就可以了
    在这里插入图片描述
  2. 可能是你的Maven没有配置或者出现了问题,重新修改个Maven配置就可以了。

5. Remember me

这个功能主要是做网页登录记住我选项达到未来一段时间不用登录的效果。
以下代码都添加在SecurityConfig配置类中。

  1. Spring Security提供了一个JdbcTokenRepositoryImpl类来帮助简化Remember Me功能的开发,创建这个类并放到Spring容器中,JdbcTokenRepositoryImpl需要数据源,通过注入的方式提供。
@Autowired
private DataSource dataSource;  //数据库连接池

@Bean
public PersistentTokenRepository persistentTokenRepositoryBean(){
    JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
    //指定数据源
    jdbcTokenRepository.setDataSource(dataSource);
    //启动时创建表,第一次启动时使用,后面要注释掉
    jdbcTokenRepository.setCreateTableOnStartup(true);
    return jdbcTokenRepository;
}

如果我们运行第二次 而jdbcTokenRepository.setCreateTableOnStartup(true);没有注释那么后台报
Error creating bean with name ‘springSecurityFilterChain’ defined in class path resource …nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘persistent_logins’ already exists,意思是这个存放记住我的相关表已经创建过了。

  1. 使用Remember-Me自动登录时,也需要查询用户的信息,需要指定UserDetailsService。
@Autowired
private UserDetailsService userDetailsService;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService); 
}
  1. 配置token的持久化方式及有效时长
http.rememberMe().tokenRepository(persistentTokenRepositoryBean()).tokenValiditySeconds(10*24*60*60);
  1. 登录页面增加remember-me字段

在这里插入图片描述

到这里Spring Security认证部分已经基本上是完了。

提一句一般用JWT替换httpBasic,只需要Spring Security整合JWT就可以了。

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

Spring框架Security(认证)快速上手 的相关文章

  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • Linux性能监控工具sysstat的cron文件

    简单来讲sysstat就是检测系统性能的工具 安装 yum install sysstat 查看生成的相关文件 rpm ql sysstat etc cron d sysstat etc sysconfig sysstat etc sysc
  • 如何使用Linux Top命令

    Linux中的top命令允许您监视当前正在运行的进程及其使用的系统资源 作为系统管理员 它可能是工具箱中最有用的工具 特别是如果您知道如何使用它的话 所有Linux发行版都预装了top实用程序 通过这个交互式命令 您可以自定义如何浏览进程列
  • node 版本管理工具 nvm,node版本升级、降级

    不同项目需要的 nodejs 版本不一致 需要在电脑上安装多个 node 版本 此时知道有一个 nvm 版本管理工具就非常必要了 NVM 下载安装 nvm 安装地址 https github com coreybutler nvm wind
  • 【数据结构】双向链表

    前面我们已经学完了单向链表 知道了单向链表如何进行增删查改等基本功能 而今天 我们将要学习双向链表 目录 1 链表的分类 2 双向链表定义 3 双向链表接口的实现 所有接口函数一览 创建返回链表头节点 初始化链表 双向链表打印 双向链表尾插
  • 在钉钉上怎么手写_钉钉直播上课可以写字吗_钉钉直播写字板功能介绍_玩游戏网...

    钉钉直播上课已经有很多学校在使用了 这个时候就有人问了 能不能在钉钉上用手写字 在学习资料上做笔记 目前发下来钉钉的很多功能 不过关于写字这个功能暂且还没有 那么想要用写字的方式教学要怎么做呢 这就让我们一起来看一看吧 当然了小编也给大家准
  • 第六章 课后习题(P171-P172)

    习题 一 填空题 1 运算符的重载实际上是 函数 的重载 2 运算符函数必须被重载为 非静态成员函数 或被重载为 友元函数 3 成员函数重载运算符需要的参数的个数总比它的操作数 少 一个 4 重载赋值运算符时 通常返回调用该运算符的 对象的
  • VScode SSH远程登陆到服务器阅读代码

    1 背景介绍 在工作中经常使用ssh远程访问服务阅读代码 但是通过ssh远程访问后没有图形界面 阅读代码非常不方便 本文向大家介绍使用VScode通过ssh远程登陆到服务器 本地可视化阅读查看服务器的代码文件 2 安装VS Code Vis
  • springboot打包成maven仓库中的sdk

    springboot打包成maven仓库中的sdk 首先将pom文件中的关于该项目继承springboot父项目的依赖去除 再去除一些不相干的依赖 插件也去除 在新项目中导入这个jar sdk 需要新建一个配置类 使用注解扫描这个jar中的
  • 记 ==> 首次使用rabbitMQ优化项目

    昨天刚学习完了rabbitMQ 刚好我的项目有个模块挺符合使用rabbitMQ进行异步处理的 这个模块大概功能是 用户发送的所有帖子都会添加到他的发件箱 当有个新用户关注了他 他发件箱内所有的博客都会被添加到关注他的用户的收件箱里 比如 A
  • CUDA基础介绍

    一 GPU简介 1985年8月20日ATi公司成立 同年10月ATi使用ASIC技术开发出了第一款图形芯片和图形卡 1992年4月ATi发布了Mach32图形卡集成了图形加速功能 1998年4月ATi被IDC评选为图形芯片工业的市场领导者
  • vs2010使用VLD,

    在VS2010项目总使用VLD visual leak detector 进行内存泄露检测 调试时程序无法启动报错 应用程序正常启动失败 0xc0150002 产生原因 VC2003 VC2005 VC2008及其后续版本 对底层最基本的C
  • C语言学习笔记(四)

    1 在编译使用了strcpy scanf等不安全的函数 而报警告和错误 而导致无法编译通过 此时我们有两种解决方案 a 在指定的源文件的开头定义 define CRT SECURE NO WARNINGS 只会在该文件里起作用 b 在项目属
  • 成功解决 git设置http代理 https代理 取消代理

    welcome to my blog 问题 使用hexo搭建博客 执行hexo init时包含git clone的操作 但是使用的是https协议 不是ssh 所以为git设置https代理 但是只设置https代理并不能加速 与此同时 只
  • python socket接收与发送数据编码

    1 服务器端接收数据 1 向服务器端发送16进制数据 3A 0B 12 2 服务器端接收数据为 未转化打印出来为 b x0b x12 格式为字节流 打打印时3A对应ASCII表中的冒号 总结为当没有进行转换时 编译器会根据接收到的十六进制的
  • CA 厂商排名

    1 NDS 2 Irdeto 3 Nagravision 4 Verimatrix 5 Widevine 6 Latens 7 Viaccess 8 Secure Media
  • 关于跑demo遇到的flask mysql navicat 导入包的解决方式

    Q1 导入demo时的第一步 打开pycharm 左上角 之后 点击settings 进入settings后 点击Project下的python interpreter 此时 右侧的python interpreter显示的是no inte
  • ctfshow web14

    题目描述 无 解题思路 这道题比较简单 分值也只有5分 就是一个简单的sql注入 但是这个sql注入的回显你得看它的源代码里才有 但是它把你右击查看源码那个玩意儿给禁了 你需要在你的url前面加view source 才能看到源码 解题过程
  • 数据库结构对比工具 支持 SqlServer ,Oracle,MySql 相互对比同步转换 源代码生成,Word表格生成Model ,文本格式化,差异对比

    数据库结构对比工具 支持 SqlServer Oracle MySql 相互对比同步 QQ群 434053880 有最新版本下载 1 CSDN 下载链接 不过要积分下载 SqlServer Oracle MySql数据库结构相互对比同步 m
  • 注意力机制学习(二)——空间注意力与pytorch案例

    文章目录 一 空间注意力机制简介 二 空间注意力与pytorch代码 三 使用案例 一 空间注意力机制简介 空间注意力的示意图如下 长条的是通道注意力机制 而平面则是空间注意力机制 可以发现 通道注意力在意的是每个特怔面的权重 空间注意力在
  • Spring框架Security(认证)快速上手

    在处理Spring安全框架时 通常可以选择Shiro或者Security 做认证授权加密等 推荐非SpringBoot 使用Shiro SpringBoot项目使用Security 学习网址 Security Shiro 目录 1 Spri