我们的整个项目就是B系统,之前已经创建了资源服务,意思是以后想要访问资源服务里面的东西,要被OAuth2.0管理。
既然已经有了资源服务,并且这个资源服务是被OAuth2.0管理的。现在就需要一个认证的服务,这个认证服务的作用就是颁发token给A系统,A系统只要访问了这个认证服务,就会得到一个token,之后拿上这个token,就可以访问资源服务了。
1 导入依赖 2 写yml配置
3 认证的配置
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserService userService;
@Bean
public BCryptPasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginProcessingUrl("/login")
.permitAll()
.and()
.csrf()
.disable();
}
//AuthenticationManager对象在OAuth2认证服务中要使用,提前放入IOC容器中
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
写我们之前自定义的认证的配置,但是现在要OAuth2.0进行认证,所以还需要添加一个新的配置 这个就是配置授权的方式,现在使用了授权码模式进行授权的配置
//AuthenticationManager对象在OAuth2认证服务中要使用,提前放入IOC容器中
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
之前写的是web的配置,也就是登录的配置,但是还有一个OAuth2.0颁发token的配置,重新写一个配置,这个配置就是认证服务器里面用OAuth2.0颁发token的配置
只要写了这个注解,并且继承了这个,那么这个自己写的类就是OAuth2.0的配置类了 之后就是重写里面的方法,开始在重写的方法里面颁发token
里面写什么? 1 数据库连接池对象 因为和OAuth2.0相关的表都在数据库里面,所以配置里面就需要引入数据源 2 认证业务对象 //认证业务对象 @Autowired private UserService userService; 写了这个就是不仅仅让用户可以直接登录这个服务,也就是单点登录,而且还可以用OAuth2.0进行认证 3授权模式专用对象
//授权模式专用对象 @Autowired private AuthenticationManager authenticationManager; 之前我们在web配置里面配置了这个授权码的配置,现在就是从哪个里面拿过来用
4//客户端信息来源 //客户端信息来源 @Bean public JdbcClientDetailsService jdbcClientDetailsService(){ return new JdbcClientDetailsService(dataSource); } A系统要有B系统的使用权,A系统要注册到这个B系统,也就是A系统的信息要在B系统里面保存,所以在认证的服务器里面要配置这个信息的来源 5//token保存策略 虽然这个认证的服务是颁发token,但是还要将生成的token保存在数据库,所以要配置一个保存策略 6//授权信息保存策略 B系统给了A系统的什么权限,这个是需要保存在B系统里面的,这个保存的模式是什么,所以需要我们定义
7授权码模式数据来源
以上的这7个只是我们需要用的对象,之后开始使用这些对象进行配置
重写人家的方法
//指定客户端信息的数据库来源
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails(jdbcClientDetailsService());
}
//检查token的策略
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.allowFormAuthenticationForClients();
security.checkTokenAccess("isAuthenticated()");
}
//OAuth2的主配置信息,整合上面的所有的配置
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.approvalStore(approvalStore())
.authenticationManager(authenticationManager)
.authorizationCodeServices(authorizationCodeServices())
.tokenStore(tokenStore());
}
OAuth2.0的所有的配置
@Configuration
@EnableAuthorizationServer
public class OauthServerConfig extends AuthorizationServerConfigurerAdapter {
//数据库连接池对象
@Autowired
private DataSource dataSource;
//认证业务对象
@Autowired
private UserService userService;
//授权模式专用对象
@Autowired
private AuthenticationManager authenticationManager;
//客户端信息来源
@Bean
public JdbcClientDetailsService jdbcClientDetailsService(){
return new JdbcClientDetailsService(dataSource);
}
//token保存策略
@Bean
public TokenStore tokenStore(){
return new JdbcTokenStore(dataSource);
}
//授权信息保存策略
@Bean
public ApprovalStore approvalStore(){
return new JdbcApprovalStore(dataSource);
}
//授权码模式数据来源
@Bean
public AuthorizationCodeServices authorizationCodeServices(){
return new JdbcAuthorizationCodeServices(dataSource);
}
//指定客户端信息的数据库来源
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails(jdbcClientDetailsService());
}
//检查token的策略
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.allowFormAuthenticationForClients();
security.checkTokenAccess("isAuthenticated()");
}
//OAuth2的主配置信息
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.approvalStore(approvalStore())
.authenticationManager(authenticationManager)
.authorizationCodeServices(authorizationCodeServices())
.tokenStore(tokenStore());
}
以上配置完成之后,那么我们的认证服务就完成了。