认证(Authentication)是证明用户身份的过程,是为了解决 “Who are you?” 的问题,即在应用中谁能证明他就是他本人。使用特定系统时,身份验证是必不可少的机制。没有正确的身份验证就很难识别用户。在认证过程中,一般需要认证者提供与他们身份信息相关的一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明。
(图片来源 —— https://www.ilantus.com/blog/authentication-vs-authorization-whats-the-difference/)
例如,有一个发送方 A 通过互联网向接收方 B 发送电子文档。系统将如何识别发送方 A 已发送给接收方 B 的专用消息。入侵者 C 可能会拦截,修改和重播文档以欺骗或窃取此类攻击,这些信息被称为 伪造 。
在给定情况下,身份验证机制可确保两件事:首先,它确保发送者和接收者都是合法的人,这就是所谓的 数据来源身份验证 。其次,它借助私密会话密钥确保了发送者和接收者之间已建立的连接的安全性,从而无法推断出该连接,这被称为 对等实体身份验证 。
授权技术用于确定授予已认证用户的权限。简而言之,它检查是否允许用户访问特定资源。授权发生在身份验证之后,在此之前先确定用户的身份,然后通过查找存储在表和数据库中的条目来确定用户的访问列表。
例如,用户 A 希望访问服务器上特定的资源文件。首先用户 A 将向服务器发送请求,接收到用户 A 的请求之后,服务器会先验证用户 A 的身份。若用户 A 通过身份验证,之后服务器将找到用户 A 所具有的相应权限,判断用户 A 是否有访问所请求资源文件的权限。一般情况下,资源的访问权限可以包括查看,修改或删除等。
(图片来源 —— https://www.ilantus.com/blog/authentication-vs-authorization-whats-the-difference/)
前面我们已经介绍了认证和授权的定义,下面我们来看一下它们之间的主要区别。
(图片来源 —— https://techdifferences.com/difference-between-authentication-and-authorization.html)
身份认证和授权是确保系统信息安全的两种机制。身份认证和授权之间的区别在于,身份认证是检查用户详细信息以识别其授予系统访问权限的过程,而授权则是检查经过身份验证的用户访问系统资源的特权或权限的过程。
身份(Principal),即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。一个主体可以有多个principal,但只有一个 Primary principal,一般是用户名/密码/手机号。
在 Spring Security 中,我们可以 将每个 GrantedAuthority 视为一个单独的特权 。比如 READ_AUTHORITY , WRITE_PRIVILEGE 甚至 CAN_EXECUTE_AS_ROOT。
当直接使用 GrantedAuthority 时,例如通过使用诸如 hasAuthority('READ_AUTHORITY')
之类的表达式 , 我们 将以细粒度的方式限制访问 。
@Override protected void configure(HttpSecurity http) throws Exception { .antMatchers("/protectedbyauthority").hasAuthority("READ_PRIVILEGE") }
类似地,在 Spring Security 中,我们可以将每个 Role 视为一个粗粒度的 GrantedAuthority ,此种 GrantedAuthority 以 ROLE 为前缀的字符串表示。当直接使用 Role 时,可使用 hasRole("ADMIN")
之类的表达式,我们将以粗粒度方式限制访问。值得注意的是,默认的 “ROLE” 前缀是可配置的。
@Override protected void configure(HttpSecurity http) throws Exception { .antMatchers("/protectedbyrole").hasRole("USER") }
全栈修仙之路,及时阅读 Angular、TypeScript、Node.js/Java和Spring技术栈最新文章。