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 进行密码加密的。

相关推荐
用户26851612107565 小时前
常见的 Git 分支命名策略和实践
后端
程序员小假5 小时前
我们来说一下 MySQL 的慢查询日志
java·后端
南囝coding5 小时前
《独立开发者精选工具》第 025 期
前端·后端
独自破碎E5 小时前
Java是怎么实现跨平台的?
java·开发语言
To Be Clean Coder5 小时前
【Spring源码】从源码倒看Spring用法(二)
java·后端·spring
xdpcxq10296 小时前
风控场景下超高并发频次计算服务
java·服务器·网络
想用offer打牌6 小时前
你真的懂Thread.currentThread().interrupt()吗?
java·后端·架构
橘色的狸花猫6 小时前
简历与岗位要求相似度分析系统
java·nlp
独自破碎E6 小时前
Leetcode1438绝对值不超过限制的最长连续子数组
java·开发语言·算法
用户91743965396 小时前
Elasticsearch Percolate Query使用优化案例-从2000到500ms
java·大数据·elasticsearch