oauth2.0+security+jwt网关登录认证

最近在研究springcloud中的网关认证,花费了一周时间,总算搭建出一个可以使用的简易框架,在此,将研究的步骤以及所踩的坑列出来。
本次搭建的结构大致如下:

如上图,步骤描述:
1、前端页面请求网关路由,网关路由判断是否包含access_token以及access_token是否已经过期。
2、不包含access_token或者已经失效,则返回403状态,前端根据这个状态码进行判断,自动调用网关登录接口。
3、用户登录以后,前端代码自动调用获取token的连接(http://localhost:8080/oauth/oauth/authorize?client_id=XXX&response_type=token&scope=1234&redirect_uri=/api/user/me)获取到access_token,然后将acceess_token设置进入cookie(此步骤由前端代码进行完成,网上的资料都只介绍了怎么获取access_token,却没有介绍怎么使用)。
4、前端代码将带有cookie为access_token的请求再次通过网关路由(apigateway)请求后端服务。
5、gateway通过access_token调用oauth2.0的check_token接口,进行校验,校验通过,oauth将所需要的用户信息返回,由gateway进行jwt加密并且放到请求头中,再由gateway带有此请求头调用主服务。
6、在主服务设置一过滤器,对所有的请求都进行jwt认证
首先判断有没有此请求头,没有直接返回401.
若有请求头,则对此请求头进行解密,解密成功则通过认证,解密失败,则返回401鉴权失败。
下面上干货:
oauth服务代码:
作为对用户鉴权的服务,网上已经有许多对它的介绍,大部分都附上了源码,大家可以参考下,我总结起来:最主要的就是对AuthorizationServerConfigurerAdapter类和WebSecurityConfigurerAdapter进行继承重写。
AuthorizationServerConfigurerAdapter是授权服务配置,它里面有三个方法,分别为
• ClientDetailsServiceConfigurer:这个configurer定义了客户端细节服务。客户详细信息可以被初始化,或者你可以参考现有的商店。
• AuthorizationServerSecurityConfigurer:在令牌端点上定义了安全约束。
• AuthorizationServerEndpointsConfigurer:定义了授权和令牌端点和令牌服务
在我的服务中,ClientDetailsServiceConfigurer我采用的是数据库存储客户端用户名和密码,然后进行配置方式。

@Bean
public TokenStore tokenStore() {
    return new JdbcTokenStore(dataSource);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
    clients.jdbc(dataSource);
}
AuthorizationServerSecurityConfigurer我配置成如下配置:
public void configure(AuthorizationServerSecurityConfigurer security) {
    security.tokenKeyAccess("permitAll()")
            .checkTokenAccess("permitAll()")
            .allowFormAuthenticationForClients()
            .passwordEncoder(passwordEncoder());
}

其中passwordEncoder()表示密码需要加密,而这个加密我担心oauth本身的加密不太安全,所以又重写了一遍,在之前先给它进行一遍AES加密。代码如下:

@Bean
public PasswordEncoder passwordEncoder() {
    return new PasswordEncoder() {
//对密码进行加密
        @Override
        public String encode(CharSequence charSequence) {
            String param = AdvCryptUtil.encryStringBySHA256(String.valueOf(charSequence));
            return new BCryptPasswordEncoder().encode(param);
        }
//登录时校验密码(加密时已经对密码做过处理,则不能再使用oauth自带的比较)
        @Override
        public boolean matches(CharSequence rawPassword, String encodedPassword) {
            String param = AdvCryptUtil.encryStringBySHA256(String.valueOf(rawPassword));
            if (encodedPassword == null || encodedPassword.length() == 0) {
                return false;
            }
            if (!BCRYPT_PATTERN.matcher(encodedP
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值