SpringBoot OAuth2.0认证管理流程详解

添加下方名片,即可获取全套学习资料哦。ExpressionBasedPreInvocationAdvice.before方法即根据定义的注解来校验是否有权限访问该接口,入下图所示,用户具备的权限包括orderDetail和orderInfo,而注解校验是否包含orderInfo权限,故校验通过。返回结果中包含state和code两个参数,state和请求中的参数一致,code表示授权码,客户端只能使用该授权码一次,该返回结果又将请求重定向到localhost8101/login。...
摘要由CSDN通过智能技术生成

OAuth2.0是一个开放的授权协议,可以用来实现第三方应用对我们API的访问控制,OAuth2.0中定义的角色包括:

  1. Resource Owner(资源拥有者)

  2. Client (第三方接入平台,请求者)

  3. Resource Server (服务器资源: 数据中心)

  4. Authorization Server (认证服务器)

授权认证的基本流程包括: 首先Client需要向Resource Owner申请授权凭据,Resource Owner同意之后会发放**授权凭据(code码)给Client,Client然后会将授权凭据和身份信息(AppId)一起发给Authorization Server申请访问令牌,Authorization Server在验证身份信息无误之后,发送访问令牌(Access Token)**给Client,Client最后根据携带Access Token去访问Resource Server中受保护的API资源。

OAuth2.0的认证模式包括四种:授权码模式密码模式简化模式客户端模式。其中授权码模式是功能最完善,流程最严密的授权模式,其基本流程图如下:

  1. 用户访问客户端,被导向认证服务器

  2. 用户给予客户端授权,认证服务器将用户导向客户端事先指定的重定向URL,并附上一个授权码

  3. 客户端收到授权码,附上早先的URL,向认证服务器申请令牌

  4. 认证服务器核对了授权码和URL,确认无误之后,向客户端发送访问令牌(access token)和更新令牌(refresh token)

SpringBoot对OAuth2.0进行了很好的支持,下面详细说明下SpringBoot中OAuth2.0的基本配置和流程。

首先搭建oauth server和oauth client的框架

在oauth server中首先定义认证服务器:

@Configuration
@EnableAuthorizationServer
public class Oauth2ServerConfig extends AuthorizationServerConfigurerAdapter {

    @Resource
    private DataSource dataSource;

    
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        super.configure(security);
    }

    /**
     * 配置ClientDetailsService,这里使用jdbc模式 
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource);
    }

    
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        super.configure(endpoints);
    }
}

这里我们配置从数据库中读取第三方应用的配置,数据表如下:

CREATE TABLE `oauth_client_details` (
  `client_id` varchar(48) NOT NULL,
  `resource_ids` varchar(256) DEFAULT NULL,
  `client_secret` varchar(256) DEFAULT NULL,
  `scope` varchar(256) DEFAULT NULL,
  `authorized_grant_types` varchar(256) DEFAULT NULL,
  `web_server_redirect_uri` varchar(256) DEFAULT NULL,
  `authorities` varchar(256) DEFAULT NULL,
  `access_token_validity` int(11) DEFAULT NULL,
  `refresh_token_validity` int(11) DEFAULT NULL,
  `additional_information` varchar(4096) DEFAULT NULL,
  `autoapprove` varchar(256) DEFAULT NULL,
  PRIMARY KEY (`client_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

接着配置资源服务器:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.requestMatchers().antMatchers("/user/**") //对/user的路径进行保护
                .and()
                .authorizeRequests()
                .anyRequest().authenticated();
    }
}

然后配置WebSecurity

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserServiceImpl userService;

    @
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值