OAuth是一个标准,用来保护数据提供者交互数据的安全,同时也涉及了数据读取者的访问方式。
Spring Security OAuth同时提供了OAuth提供者和OAuth消费者2个实现,通常,你只会使用其中一个,极少数情况下你会同时使用这两个实现。胆小的人不适合在应用上使用安全措施,OAuth就是如此,因为这不是一件简单的事情。
我们从实际使用出发,来归纳下目前web调用安全方面的策略:
1、传统PC端用户名密码认证
2、APP端用户名密码认证或短信验证码认证
3、跨系统之间服务调用认证
对于和客户端是浏览器的情况,早期的认证机制采用的是cookie+session方式,用户在首次登陆校验通过后,服务端会给每个用户生成一个hash唯一串sessionid,并将适当的用户信息作为value存入session中,同时将sessionid发送给浏览器到cookie中,浏览器每次请求都通过cookie携带这个串到服务端,服务端就能识别每个请求对应的用户是否有效。这种方式依赖浏览器cookie,不够通用。
后来我们使用token了,淘汰了cookie + session机制了。token的意思是令牌、标记。概括来说,token技术使用流程是,用户认证通过以后,服务端生成token返回给客户端,客户端将token存起来,以后每次请求都将token放到请求header中,服务端就能识别出合法请求。
那Spring Security有什么用处呢?用来完成用户认证和授权,这点在PC端后台上是很常见的,根据用户角色不同,访问不同功能,Spring Security完全能满足你的需求。Spring Security使用可以看这里。OAuth2相关可以看这里。
这里来说Spring Security OAuth2的使用,他是和Spring Security结合的,所以使用时你能看到Spring Securty相似的规则。总的来说就是要配置编写认证+资源授权两个能力。认证通常需要通过拦截URI来判断,授权通常需要配置资源服务来实现。有一点是需要大家注意的,OAuth中有4中角色
资源拥有者
资源服务器
客户端应用
授权服务器
大家注意到一点没有,这里没有认证相关的字眼,但是在Spring Security中是有认证的,就是这点区别就说明了OAuth做的事情是什么了。由此可见,Spring Security OAuth2淡化了认证概念,甚至看不到认证相关字眼,强化了授权概念,或者说OAuth2中的授权已经不是简单的用户权限管理了。之所以这样,是因为OAuth是开放授权Open Authorization,针对所有用户开放,全部认证通过,把限制全部留到授权这一关,认证往往是贴近业务层次的。OAuth2的实现以及使用对应到代码中去也是一样,所以大家在进行功能编写的时候要紧紧抓住这些细节核心,就不会把自己搞糊涂。还有一点,OAuth2不仅仅是给你A网站跳B网站,授权获取数据什么的,网上很多人博客硬是咬着这个不放,太狭隘了,OAuth2更多使用的地方不是这里,请各位注意。
另外OAuth2规定了4种授权模式,就是4种获取令牌(Token)的方式,所以,你在理解流程的使用应该奔着获取如何获取token的目标去。4种获取token的方式分别是授权码(authorization-code),隐藏式(implicit),密码式(password),客户端凭证(client credentials)。
使用的大方向是配置资源服务和授权服务,如果你需要认证,其实是使用Spring Security的认证机制,也即继承org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter这个类,这里我们先以API安全认证来举例,因为这个使用最多,想象一下,你的服务要提供接口给自有APP调用,如何验证自有APP调用合法性?Oauth2给了你答案。这种情况下使用的是密码模式,客户端向授权服务提供用户名和密码,授权服务器验证通过后返回token,客户端带着token请求资源服务器,资源服务器返回响应数据。