OAuth2+JWT 实现权限验证

level:

org.springframework.web.servlet.DispatcherServlet: debug

org.springframework.cloud.sleuth: debug

启动类

@SpringBootApplication

@EnableDiscoveryClient

public class ServiceOauthHw9900Application {

public static void main(String[] args) {

SpringApplication.run(ServiceOauthHw9900Application.class, args);

}

}

config

自定义一个 OauthServerConfiger。当前类为Oauth2 server的配置类(需要继承特定的父类 AuthorizationServerConfigurerAdapter)

@Configuration

@EnableAuthorizationServer //开启认证服务器功能

public class OauthServerConfiger extends AuthorizationServerConfigurerAdapter {

@Autowired

private AuthenticationManager authenticationManager;

/**

  • 客户端详情配置,

  • 比如client_id,secret

  • 当前这个服务就如同QQ平台,拉勾网作为客户端需要qq平台进行登录授权认证等,提前需要到QQ平台注册,QQ平台会给拉勾网

  • 颁发client_id等必要参数,表明客户端是谁

  • @param clients

  • @throws Exception

*/

@Override

public void configure(ClientDetailsServiceConfigurer clients) throws Exception {

super.configure(clients);

// 客户端信息存储在什么地方,可以在内存中,可以在数据库里

clients.inMemory()

// 添加一个client配置,指定其client_id

.withClient(“quellanan”)

//指定客户端的密码/安全码

.secret(“abcdefg”)

//指定客户端所能访问资源id清单,此处的资源id是需要在具体的资源服务器上也配置一样

.redirectUris(“*”)

//认证类型/令牌颁发模式,可以配置多个在这里,但是不一定都用,具体使用哪种方式颁发token,需要客户端调用的时候传递参数指定

.authorizedGrantTypes(“password”,“refresh_token”)

//客户端的权限范围,此处配置为all全部即可

.scopes(“all”);

}

/**

  • 认证服务器最终是以api接口的方式对外提供服务(校验合法性并生成令牌、校验令牌等)

  • 那么,以api接口方式对外的话,就涉及到接口的访问权限,我们需要在这里进行必要的配置

  • @param security

  • @throws Exception

*/

@Override

public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {

super.configure(security);

// 相当于打开endpoints 访问接口的开关,这样的话后期我们能够访问该接口

security

// 允许客户端表单认证

.allowFormAuthenticationForClients()

// 开启端口/oauth/token_key的访问权限(允许)

.tokenKeyAccess(“permitAll()”)

// 开启端口/oauth/check_token的访问权限(允许)

.checkTokenAccess(“permitAll()”);

}

@Override

public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {

super.configure(endpoints);

endpoints

// 指定token的存储方法

.tokenStore(tokenStore())

// token服务的一个描述,可以认为是token生成细节的描述,比如有效时间多少等

.tokenServices(authorizationServerTokenServices())

// 指定认证管理器,随后注入一个到当前类使用即可

.authenticationManager(authenticationManager)

.allowedTokenEndpointRequestMethods(HttpMethod.GET,HttpMethod.POST);

}

/*

该方法用于创建tokenStore对象(令牌存储对象)

token以什么形式存储

*/

public TokenStore tokenStore(){

return new InMemoryTokenStore();

// 使用jwt令牌

//return new JwtTokenStore(jwtAccessTokenConverter());

}

/**

  • 该方法用户获取一个token服务对象(该对象描述了token有效期等信息)

*/

public AuthorizationServerTokenServices authorizationServerTokenServices() {

// 使用默认实现

DefaultTokenServices defaultTokenServices = new DefaultTokenServices();

defaultTokenServices.setSupportRefreshToken(true); // 是否开启令牌刷新

defaultTokenServices.setTokenStore(tokenStore());

// 针对jwt令牌的添加

//defaultTokenServices.setTokenEnhancer(jwtAccessTokenConverter());

// 设置令牌有效时间(一般设置为2个小时)

defaultTokenServices.setAccessTokenValiditySeconds(20); // access_token就是我们请求资源需要携带的令牌

// 设置刷新令牌的有效时间

defaultTokenServices.setRefreshTokenValiditySeconds(259200); // 3天

return defaultTokenServices;

}

}

关于三个 configure ⽅法

  • configure(ClientDetailsServiceConfifigurer clients):⽤来配置客户端详情服务(ClientDetailsService),客户端详情信息在 这⾥进⾏初始化,你能够把客户端详情信息写死在这⾥或者是通过数据库来存储调取详情信息

  • confifigure(AuthorizationServerEndpointsConfifigurer endpoints):⽤来配置令牌(token)的访问端点和令牌服务(token services)

  • confifigure(AuthorizationServerSecurityConfifigurer oauthServer):⽤来配置令牌端点的安全约束.

关于 TokenStore

  • InMemoryTokenStore默认采⽤,它可以完美的⼯作在单服务器上(即访问并发量 压⼒不⼤的情况下,并且它在失败的时候不会进⾏备份),⼤多数的项⽬都可以使⽤这个版本的实现来进⾏ 尝试,你可以在开发的时候使⽤它来进⾏管理,因为不会被保存到磁盘中,所以更易于调试。

  • JdbcTokenStore这是⼀个基于JDBC的实现版本,令牌会被保存进关系型数据库。使⽤这个版本的实现时, 你可以在不同的服务器之间共享令牌信息,使⽤这个版本的时候请注意把"springjdbc"这个依赖加⼊到你的 classpath当中。JwtTokenStore 这个版本的全称是 JSON Web Token(JWT),它可以把令牌相关的数据进⾏编码(因此对于后端服务来说,它不需要进⾏存储,这将是⼀个重⼤优势),缺点就是这个令牌占⽤的空间会⽐较⼤,如果你加⼊了⽐较多⽤户凭证信息,JwtTokenStore 不会保存任何数据。

然后再自定义有一个配置类,主要处理用户名和密码的校验等事宜。

@Configuration

public class SecurityConfiger extends WebSecurityConfigurerAdapter {

@Autowired

private PasswordEncoder passwordEncoder;

//@Autowired

//private JdbcUserDetailsService jdbcUserDetailsService;

/**

  • 注册一个认证管理器对象到容器

*/

@Bean

@Override

public AuthenticationManager authenticationManagerBean() throws Exception {

return super.authenticationManagerBean();

}

/**

  • 密码编码对象(密码不进行加密处理)

  • @return

*/

@Bean

public PasswordEncoder passwordEncoder() {

return NoOpPasswordEncoder.getInstance();

}

/**

  • 处理用户名和密码验证事宜

  • 1)客户端传递username和password参数到认证服务器

  • 2)一般来说,username和password会存储在数据库中的用户表中

  • 3)根据用户表中数据,验证当前传递过来的用户信息的合法性

*/

@Override

protected void configure(AuthenticationManagerBuilder auth) throws Exception {

// 在这个方法中就可以去关联数据库了,当前我们先把用户信息配置在内存中

// 实例化一个用户对象(相当于数据表中的一条用户记录)

UserDetails user = new User(“admin”,“123456”,new ArrayList<>());

auth.inMemoryAuthentication()

.withUser(user).passwordEncoder(passwordEncoder);

//auth.userDetailsService(jdbcUserDetailsService).passwordEncoder(passwordEncoder);

}

}

JWT 改造统⼀认证授权中⼼的令牌存储机制

JWT 令牌介绍

通过上边的测试我们发现,当资源服务和授权服务不在⼀起时资源服务使⽤RemoteTokenServices 远程请求授权 服务验证token,如果访问量较⼤将会影响系统的性能。

解决上边问题: 令牌采⽤JWT格式即可解决上边的问题,⽤户认证通过会得到⼀个JWT令牌,JWT令牌中已经包括了⽤户相关的信 息,客户端只需要携带JWT访问资源服务,资源服务根据事先约定的算法⾃⾏完成令牌校验,⽆需每次都请求认证 服务完成授权。

什么是JWT?

JSON Web Token(JWT)是⼀个开放的⾏业标准(RFC 7519),它定义了⼀种简介的、⾃包含的协议格式,⽤于 在通信双⽅传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使⽤HMAC算法或使⽤RSA的公 钥/私钥对来签名,防⽌被篡改。

JWT令牌结构

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面

小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

image

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

image

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

image

image
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
调优+微服务+并发编程+网络+设计模式+数据结构与算法>

[外链图片转存中…(img-8biZRZ7U-1712054007873)]

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

[外链图片转存中…(img-pHnxvUHT-1712054007874)]

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

[外链图片转存中…(img-peUdPOi3-1712054007874)]

[外链图片转存中…(img-mPZcbAYS-1712054007874)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值