开发者学堂课程【Spring Security知识精讲与实战演示(四):案例之oauth2认证所需资源说明】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/733/detail/13086
案例之oauth2认证所需资源说明
内容介绍:
一、初步配置oauth2服务端文件
二、认证oauth2的步骤
三、配置oauth2认证服务
一、初步配置oauth2服务端文件
开始进入一个重要的文件,oauth2服务端文件,如图所示:
我们先新建一个page类,命名如下:
类名可以是任意名字,page类对象如果要起作用,要声明其是个page类,再加上一个注解,叫做enableAuthorizationServer,这个注解跟以前写得差不多,需要继承一个类,或者一个接口,一般是选择继承一个类,只需要把原码复制过来,如果打开看不到这个注解,可以看一下左上角有一个原码的选项,就可以点击那个,原码内容如下:
让其继承这个对象,把上图蓝色背景的复制过来就可以了。
二、认证oauth2的步骤
接下来要写的有点多,先把步骤给列出来,然后再一一往里填充,步骤如下:
1.数据库连接池对象
oauth2是跟着所有的一些数据来源,或者是要写数据库的一些信息,那就需要要得到这个oauth对象然后才能去操作这个数据库表,那这个对象肯定也是需要的,所以第一个数据库连接池对象必要的。
2.认证业务对象
这个认证业务对象其实就是这里边刚才已经用过的一个service,如图所示:
刚才已经写过了为什么还要再写一遍,明确一个事情,当前的这一个认证系统,既可以使用springSecurity,又可以使用oauth2,这是两个平行的技术,互不干扰。
看上图就表示可以让用户过来进行单点登录,进行我们用户的一个正常的认证,oauth2的功能是什么呢?可以让其他系统拿着token过来访问当前的系统,换句话来说,就是这里的认证在之前的security中已经写过一次,但是在oauth2中要做另外一个token的颁发,所以说在里边需要另外一套跟他是独立运行的,所以说在这里就要认证业务对象,原封不动再登录以下,因为这里如果想要A系统用B系统,用户要登录B系统,否则不可以使用。
3.授权码模式专业对象
这个对象之前有强调过:
上图可见在这里边放的一个对象就是为了让我们用,要给它移动回来,不移动回来的话就没办法使用这个对象,这个对象就可以拿到这个文件来用。
4.客户端信息来源
这一点要注意客户端指的是上图所示的A系统,如果想要A系统直接去访问B系统,就要让B系统有一个授用权,该如何使用呢?就注册一个客户端,客户端信息一般就保存到数据库表中。
5.token保存策略
需要保存token。
6.授权信息保存策略
解释:A系统将来要访问B系统,就要给A系统授权,那么B系统给A系统授权,B系统给A系统授了什么样的权限,一定要记录下来,比如oauthd2的产品模块的查询条件,就要记录下来,什么时候得到了这个系统的一个查询条件,将来有根可循,一定要有的一个授权的信息。
7.授权码模式数据来源
授权码模式为什么那么特殊,有一个专门的数据来源呢?刚才分析流程的时候感觉授权码就特别的复杂,比如后端的一个表,有很多的字段都是跟授权码相关的,比如下图的web_server_redirect_url:
如果不保留这个地址,那么A系统的服务器就暴露出来了,是不合适的,应该将这个地址存储到服务器中,将来用到的时候要从授权码模式数据来源这个地方来拿,授权码数据来源可以从这里写入。
三、配置oauth2认证服务
授权配置,名字如下:
首先是数据库,是DataSource,接下来是一个认证业务,然后是数据库中查询出客户端信息,token保存策略,授权信息保存策略,授权码模式专用对象,指定客户端登录来源信息,一共有七个对象。
开始配置,对象有了配置就简单了,当前的oauth2认证的每一个对象的功能如上介绍,下面在配的时候就直接填充。
//数据库的名字
@Autowired
private DataSource dataSource;
//认证业务
@Autowired
private AuthenticationManager authenticationManager;
//从数据库中查询出客户端信息
@Autowired
private UserDetailsservice userDetailsservice;
//token保存策略
@Bean
public JdbcClientDetailsService clientDetailsService() {
return new JdbcclientDetailsservice(dataSource);
)
//授权信息保存策略
@Bean
public Tokenstore tokenstore() {
return new JdbcTokenstore(datasource) ;
//授权码模式专用对象
@Bean
public AuthorizationcodeServices authorizationcodeServices() {
return new dbcAuthorizationcodeservices(dataSource);
}
//指定客户端登录信息来源override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withclientDetails(clientDetailsService());
)
@override
public
void
configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer.allowFormAuthenticationForClients();
根据以上代码配置我们就可以配置成功了。