Spring Security

Spring Security 重要的是实战,这里仅对小部分知识点进行总结

有哪些控制请求访问权限的方法?

  • permitAll():无条件允许任何形式访问,不管你登录还是没有登录。
  • anonymous():允许匿名访问,也就是没有登录才可以访问。
  • denyAll():无条件决绝任何形式的访问。
  • authenticated():只允许已认证的用户访问。
  • fullyAuthenticated():只允许已经登录或者通过 remember-me 登录的用户访问。
  • hasRole(String) : 只允许指定的角色访问。
  • hasAnyRole(String) : 指定一个或者多个角色,满足其一的用户即可访问。
  • hasAuthority(String):只允许具有指定权限的用户访问
  • hasAnyAuthority(String):指定一个或者多个权限,满足其一的用户即可访问。
  • hasIpAddress(String) : 只允许指定 ip 的用户访问。

hasRole 和 hasAuthority有区别吗?

在Spring Security中,`hasRole` 和 `hasAuthority` 是用于表达访问控制规则的方法,它们用来检查当前认证的用户是否具有指定的角色或权限。虽然这两个方法看起来很相似,但它们之间确实有一些细微的区别。

  1. hasRole:
  • `hasRole` 方法是用来检查用户是否拥有特定角色。

  • 使用 `hasRole` 时,通常会在角色名称前加上一个前缀 "ROLE_"。这是因为Spring Security默认期望角色权限以 "ROLE_" 开头。

  • 示例:`@PreAuthorize("hasRole('ADMIN')")` 或者 `@Secured("ROLE_ADMIN")`。

  1. hasAuthority:
  • `hasAuthority` 方法是更为通用的检查方式,它可以用来检查任何权限(不仅仅是角色),因为权限可以代表更细粒度的操作许可。

  • 使用 `hasAuthority` 时不需要添加 "ROLE_" 前缀,除非你的权限字符串本身就有这个前缀。

  • 示例:`@PreAuthorize("hasAuthority('CREATE_USER')")`。

总结来说,如果你是在检查用户是否拥有某个角色,那么你可能会使用 `hasRole`。如果你需要验证的是一个更具体的权限(不一定是角色),那么你可以使用 `hasAuthority`。此外,`hasAuthority` 可以与 `hasRole` 兼容,也就是说,你可以用 `hasAuthority` 来检查带有 "ROLE_" 前缀的角色权限。

如何对密码进行加密?

如果我们需要保存密码这类敏感数据到数据库的话,需要先加密再保存。

Spring Security 提供了多种加密算法的实现,开箱即用,非常方便。这些加密算法实现类的接口是 PasswordEncoder ,如果你想要自己实现一个加密算法的话,也需要实现 PasswordEncoder 接口。

PasswordEncoder 接口一共也就 3 个必须实现的方法。

java 复制代码
public interface PasswordEncoder {
    // 加密也就是对原始密码进行编码
    String encode(CharSequence var1);
    // 比对原始密码和数据库中保存的密码
    boolean matches(CharSequence var1, String var2);
    // 判断加密密码是否需要再次进行加密,默认返回 false
    default boolean upgradeEncoding(String encodedPassword) {
        return false;
    }
}

官方推荐使用基于 bcrypt 强哈希函数的加密算法实现类。

如何优雅更换系统使用的加密算法?

如果我们在开发过程中,突然发现现有的加密算法无法满足我们的需求,需要更换成另外一个加密算法,这个时候应该怎么办呢?

推荐的做法是通过 DelegatingPasswordEncoder 兼容多种不同的密码加密方案,以适应不同的业务需求。

从名字也能看出来,DelegatingPasswordEncoder 其实就是一个代理类,并非是一种全新的加密算法,它做的事情就是代理上面提到的加密算法实现类。在 Spring Security 5.0 之后,默认就是基于 DelegatingPasswordEncoder 进行密码加密的。

相关推荐
Wang's Blog2 分钟前
Java 项目部署之 Docker工具快速入门: Docker 是什么以及它如何解决部署环境问题
java·开发语言·docker
老木避暑研究所7 分钟前
从原始数据到洞察:一次完整的避暑房环境数据采集、清洗与可视化分析
java·开发语言
前端 贾公子32 分钟前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
huaweichenai39 分钟前
spring boot 实现file文件上传
java·spring boot·后端
VX_bysjlw9851 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
桃西西呀1 小时前
Spring AI Alibaba 之七:我没写一行 tracing 埋点,Agent 每一步却被 Micrometer 看得清清楚楚
人工智能·spring·llm
桃西西呀1 小时前
Spring AI Alibaba 之八:我让 Agent 直接执行 shell 命令,它却读到了目录里的密钥,沙箱到底防住了什么
人工智能·spring·llm
荣码1 小时前
从0到1搭一个生产级RAG系统:串联前面21篇所有知识
java·python
xuxigifxfh1 小时前
牛客:HJ170 01序列
java·开发语言·算法·华为机考
Zelman1 小时前
测试层级与测试类型
后端·面试·测试