全球简讯:spring-security-oauth2是什么?OAuth2与spring-security-oauth2
OAuth2与spring-security-oauth2
(资料图片仅供参考)
OAuth2OAuth2是什么OAuth2中4种授权模式作用场景 spring-security-oauth2spring-security-oauth2是什么搭建spring-security-oauth2案例环境版本pom.xmlapplication.yml 目录结构密码模式获取token访问受保护的资源 授权码模式获取code获取token访问受保护的资源 结语
OAuth2
OAuth2是什么
OAuth2中4种授权模式作用场景
授权码模式 授权码模式一般用于提供给第三方使用简化模式 简化模式一般不会使用密码模式 密码模式一般仅用于系统内部使用客户端凭证模式 客户端凭证模式一般不会使用
spring-security-oauth2
spring-security-oauth2是什么
spring-security-oauth2是基于spring-security框架完整实现oauth2协议的框架,具有oauth2中4种模式访问和第三方登录等功能。
搭建spring-security-oauth2案例
环境版本
1.8Hoxton.SR92.3.0.RELEASE8.0.15
pom.xml
org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testorg.springframework.bootspring-boot-starter-jdbcorg.springframework.cloudspring-cloud-starter-securityorg.springframework.cloudspring-cloud-starter-oauth2org.springframework.securityspring-security-jwt1.1.0.RELEASEmysqlmysql-connector-java${mysql.connector.version}org.springframework.bootspring-boot-starter-data-redisorg.projectlomboklombokorg.springframework.bootspring-boot-dependencies${spring.boot.version}pomimportorg.springframework.cloudspring-cloud-dependencies${spring.cloud.version}pomimport
application.yml
server: port: 8080spring: datasource: url: jdbc:mysql://192.168.174.129:3306/oauth?serverTimezone=GMT%2B8&characterEncoding=utf-8&autoReconnect=true&allowMultiQueries=true username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver
目录结构
DemoAuthorizationServerConfiguration:授权服务配置
@Configuration@EnableAuthorizationServer@AllArgsConstructorpublic class DemoAuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {private DataSource dataSource;private TokenStore tokenStore;private AuthenticationManager authenticationManager;private UserDetailsService userDetailsService;private TokenEnhancer tokenEnhancer;private JwtAccessTokenConverter jwtAccessTokenConverter;@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {// @formatter:offclients.inMemory().withClient("test-client").secret("$2a$08$YGw560YLRWHg3Hl29ZlmdOfAeyRQ2u0kDiqUyQ62Y1pkW5n4a.hjO").authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit").authorities("ROLE_CLIENT").redirectUris("http://localhost:8084/oauth/callback").scopes("read", "write", "all");// 请求参数scope必须为集合中的某个值// @formatter:on}@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {// 允许表单传参client信息security.allowFormAuthenticationForClients().tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");}@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.tokenStore(tokenStore).authenticationManager(authenticationManager).userDetailsService(userDetailsService).tokenEnhancer(tokenEnhancer).accessTokenConverter(jwtAccessTokenConverter);}}
DemoJwtTokenStoreConfiguration:JwtToken仓库配置
@Configurationpublic class DemoJwtTokenStoreConfiguration {@Beanpublic TokenStore tokenStore(JwtAccessTokenConverter tokenConverter) {return new JwtTokenStore(tokenConverter);}@Beanpublic JwtAccessTokenConverter tokenConverter() {JwtAccessTokenConverter tokenConverter = new JwtAccessTokenConverter();tokenConverter.setSigningKey("abc");return tokenConverter;}@Beanpublic TokenEnhancer tokenEnhancer(JwtAccessTokenConverter tokenConverter) {return new DemoJwtTokenEnhancer(tokenConverter);}}
DemoResourceServerConfiguration:资源服务配置
@Configuration@EnableResourceServer@AllArgsConstructorpublic class DemoResourceServerConfiguration extends ResourceServerConfigurerAdapter {private AccessDeniedHandler accessDeniedHandler;//private AuthenticationEntryPoint authenticationEntryPoint;@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().exceptionHandling().accessDeniedHandler(accessDeniedHandler)//.authenticationEntryPoint(authenticationEntryPoint).and().csrf().disable();}@Overridepublic void configure(ResourceServerSecurityConfigurer resources) throws Exception {super.configure(resources);}}
DemoWebSecurityConfiguration:WebSecurity配置
@Configurationpublic class DemoWebSecurityConfiguration extends WebSecurityConfigurerAdapter {@Bean@Override@SneakyThrowspublic AuthenticationManager authenticationManagerBean() {return super.authenticationManagerBean();}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder(BCryptPasswordEncoder.BCryptVersion.$2A, 8);}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.httpBasic().and().csrf().disable();}}
DemoController:受保护的Controller资源
@RestController@RequestMapping("/api")public class DemoController {@RequestMapping("/test")public Maptest() {Mapresult = new HashMap<>();result.put("time", System.currentTimeMillis());return result;}}
DemoClientDetailsService:ClientDetailsService实现类
public class DemoClientDetailsService extends JdbcClientDetailsService {public DemoClientDetailsService(DataSource dataSource) {super(dataSource);}}
DemoUserDetails:用户信息类
@Getterpublic class DemoUserDetails extends User {/** * 用户id */private String userId;/** * 手机号 */private String mobile;/** * 是否超级管理员 1是 0否 */private Boolean administrator;/** * 角色id */private Listroles;public DemoUserDetails(String userId, String mobile, String username, String password, boolean enabled, Listroles, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection authorities, Boolean administrator) {super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked,authorities);this.userId = userId;this.roles = roles;this.administrator = administrator;this.mobile = mobile;}}
DemoUserDetailsServiceImpl:UserDetailsService实现类
@Servicepublic class DemoUserDetailsServiceImpl implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {return new DemoUserDetails("userId", "mobile", s, "$2a$08$EiGfaup8QkkjT6DhvCSFRuNhdFTEV7Rbu/avUm8lGL2ZUji/lTWji", true, Arrays.asList(1L), true, true, true,AuthorityUtils.commaSeparatedStringToAuthorityList("1,2"), false);}}
DemoAccessDeniedHandler:403处理器
@Componentpublic class DemoAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException {httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);httpServletResponse.setContentType("application/json;charset=UTF-8");PrintWriter out = httpServletResponse.getWriter();out.write(new ObjectMapper().writeValueAsString("权限不足,请联系管理员!"));out.flush();out.close();}}
DemoAuthenticationEntryPoint:401处理器
//@Componentpublic class DemoAuthenticationEntryPoint implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);httpServletResponse.setContentType("application/json;charset=UTF-8");PrintWriter out = httpServletResponse.getWriter();out.write(new ObjectMapper().writeValueAsString("请先登录!"));out.flush();out.close();}}
DemoJwtTokenEnhancer:TokenEnhancer实现类
@AllArgsConstructorpublic class DemoJwtTokenEnhancer implements TokenEnhancer {private JwtAccessTokenConverter jwtAccessTokenConverter;@Overridepublic OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {DemoUserDetails principal =(DemoUserDetails) authentication.getUserAuthentication().getPrincipal();Mapinfo = new HashMap<>();info.put("user_id", principal.getUserId() == null ? "" : String.valueOf(principal.getUserId()));((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(info);return jwtAccessTokenConverter.enhance(accessToken, authentication);}}
DemoPasswordEncoder:PasswordEncoder实现类
public class DemoPasswordEncoder implements PasswordEncoder {@Overridepublic String encode(CharSequence rawPassword) {return (String) rawPassword;}@Overridepublic boolean matches(CharSequence rawPassword, String encodedPassword) {return encodedPassword.equals(encode(rawPassword));}}
密码模式
获取token
/oauth/token,获取token,access_token就是我们需要在请求头中携带的token。 访问url: http://localhost:8080/oauth/token?username=admin&password=qwer1234&grant_type=password&scope=all 并在请求头中加入basic auth参数 眼力好的同学已经看出来上图中已经在url中出现了client… 也可以直接访问这个url: http://localhost:8080/oauth/token?username=admin&password=qwer1234&grant_type=password&scope=all&client_id=test-client&client_secret=abc 这种访问方式又是哪里出来的?第一个java代码块里面就有配置了… allowFormAuthenticationForClients又是怎么实现的呢?
@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {// 允许表单传参client信息security.allowFormAuthenticationForClients().tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");}
访问受保护的资源
访问受保护的资源 图片中就是在请求头中将入key为Authorization的值 Authorization Bearer eyJhbGciOiJ…
授权码模式
获取code
直接在浏览器上访问该链接 http://localhost:8080/oauth/authorize?response_type=code&scope=all&client_id=test-client&client_secret=abc&redirect_uri=http://localhost:8084/oauth/callback
浏览器弹出httpBasic验证 输入预设用户名/密码:admin/qwer1234 点击确定,弹出OAuth2用户授权页面,点击授权Authorize 页面重定向到redirect_uri参数指定的url并附带了code
获取token
使用上一步中获取的code替换下面的,并访问url: http://localhost:8080/oauth/token?grant_type=authorization_code&client_id=test-client&client_secret=abc&redirect_uri=http://localhost:8084/oauth/callback&code=OWwAmR
不会有人直接复制链接不改code参数吧?不会吧,不会吧
访问受保护的资源
该步骤与密码模式中一致
结语
spring-security-oauth2秉承spring一贯风格特色,配置多种多样,如果见到和上面配置不一样很正常,如果想要深入了解,需要仔细阅读源码。上面的案例只是简单的入门描述,由此可以引发很多疑问。
使用数据库配置client与user怎么做需要配置手机号验证码登录等其他方式需要怎么做授权码模式需要用户手动授权,如果特殊情况下改为不需要授权怎么做需要在网关中使用,该怎么做需要权限验证,该怎么做基于spring-security-oauth2框架的单点登录怎么做 …
关注点赞,下次继续更新
配置篇 spring-security-oauth2 配置(一)
源码分析篇A路线 spring-security-oauth2 源码分析A路线(一)
源码分析篇B路线 spring-security-oauth2 源码分析B路线(一)
标签:
相关推荐:
- []全球简讯:spring-security-oauth2是什么?OAuth2与spring-security-oauth2
- []百度收录网站有哪些诀窍?百度收录网站的诀窍
- []简讯:u-center软件配置ublox系列协议手册 详情介绍
- []java连接数据库sql2000开发电话计费管理系统:环球快看点
- []世界微动态丨HEVC格式和H265格式有什么区别?DIVX、AVC、HEVC格式的区别
- []当前视点!大同市行政区划谷歌卫星地图 山西省大同市谷歌高清卫星地图下载
- []如何做一个自动化感应垃圾桶?自动化感应垃圾桶制作教程
- []停止一个Activity动态给UI控件设置前景透明色-世界观察
最新新闻:
- 停止一个Activity动态给UI控件设置前景透明色-世界观察
- iPhone4S怎么设置手机铃声?iPhone4S手机铃声设置步骤
- YY商城的交易方式有哪些?YY商城的方式一共有三种-观速讯
- 小米3全网通版再刷安卓原生系统:苹果iPhone5国行版
- 当前最新:数据库管理系统(DBMS)——数据库原理及其应用
- 动画显示Ammeter支持将电量、油量以动画形式展示(一)
- 【天天报资讯】iPhone怎么解除流量下载限制?iPhone解除流量下载限制的方法
- 头条:o哒取代基效应:分子中的电子效应
- 世界微动态丨HEVC格式和H265格式有什么区别?DIVX、AVC、HEVC格式的区别
- 前沿资讯!什么App软件里面可以换发型照相?发型屋、魔发相机和AR魔镜
- 冒险岛维护时间延长 升级至V161“黑魔法师”版本 世界视讯
- 世界焦点!什么是骨传导耳机?骨传导耳机品牌都有哪些?
- 如何做一个自动化感应垃圾桶?自动化感应垃圾桶制作教程
- 当前视点!大同市行政区划谷歌卫星地图 山西省大同市谷歌高清卫星地图下载
- morphologyEx函数实现黑帽操作 前沿热点
- 环球观热点:亚马逊kindle怎么设置?亚马逊的新款Kindle Fire平板电脑
- 怎样在word文档画虚线?Word文档小技巧_世界即时
- 百度收录网站有哪些诀窍?百度收录网站的诀窍
- 环球热资讯!电视黑屏有声音怎么回事?电视黑屏有声音的原因
- 如何使用电脑录制视频?电脑录制视频的方法步骤|天天快讯
- java连接数据库sql2000开发电话计费管理系统:环球快看点
- 什么是3d打印?3D打印技术的发展趋势_环球速讯
- 希腊字母念法是什么?数学常用希腊字母念法
- JAVA办公管理系统(OA) 开源的java项目框架 新视野
- 2019年度编程语言排行榜:Go、Perl和Groovy上榜 焦点热门
- iPhone怎么把信号标志改成圆点?使用教程来了
- 什么是浏览器缓存?如何在所有主要浏览器中清除浏览器缓存?
- 希腊神话中最美丽的女人——木马屠城记-海伦特洛伊_全球消息
- 环球实时:混音器怎么用?混音器的操作方法
- 当前资讯!网络服务器负载均衡原理是什么?网络服务器的负载均衡结构有多厉害?
- 车载冰箱危害有哪些?车载冰箱危害介绍
- 环境映射是反射吗?mental ray渲染引擎----环境映射_焦点讯息
- 诺基亚最经典手机是什么?诺基亚最经典的五款手机介绍|天天亮点
- HBO公布《权力的游戏》第七季主演人选 布劳德本特即将加盟_世界微动态
- 微信聊天记录导出成纯文本文件 用安卓模拟器破解了 天天资讯
- 环球热文:Mac电脑中delete键的几种用法?delete键功能介绍
- 简讯:u-center软件配置ublox系列协议手册 详情介绍
- 什么是Gonic?老苏教你如何使用Gonsonic
- 华为c8650怎么刷机?华为c88650的刷机教程及方法
- 视焦点讯!如何搭建高德离线地图服务?bigemap搭建离线地图二次开发示例
- 环球头条:NSA是假5G?NSA组网模式有哪些?
- 市场上销售的网络可视电话是什么?网络可视电话介绍与市场报价|环球时讯
- 小米8解BL锁教程 怎么申请BootLoader解锁?
- 国外拍摄婚礼应注意什么?海外摄影师须知常识 环球速读
- 全球简讯:spring-security-oauth2是什么?OAuth2与spring-security-oauth2
- 全球速看:wpcap.dll文件无法加载?wpcap.dll/Packet.dll/pthreadVC.dll丢失解决办法
- 今日精选:《坎巴拉太空计划2》预告片展示教学步骤
- 横版平台动作游戏《少女魔净》开场动画展示 环球报道
- 神谷盛治表示香草社19年暗示的新作开发现已完成
- 曝姆巴佩想买下C罗的私人飞机 交易金额未透露:热头条
- -53℃漠河美女主播启动i9-13900K、RTX4090!魔幻一幕出现 今日热议
- 全球新资讯:藩王弊端那么明显,朱元璋非要坚持分封藩王,有何深意?
- “今年春节档后劲最大的电影”冲上热搜 你最喜欢哪一部?-焦点热议
- 《最后的生还者》第一集已在油管上免费提供 支持1080P:环球观点
- 游客爆料北海用餐被宰:4个菜1500元 出租车带去的
- 全球信息:小岛转发《死亡搁浅2》饭制海报 由预告画面拼接而成
- 《死亡空间:重制版》PC版存在CPU优化问题:快播报
- 《卧龙:苍天陨落》曹操刘备孙坚角色介绍 三国人设光荣烂熟于心
- 传《飙酷车神3》即将正式公布 采用新引擎开发 全球播报
- 《最终幻想起源:天堂的陌生人》可能有续作-每日头条
- GameFreak谈原创IP游戏开发:不该限制在小型项目上
- Tesla纯电皮卡继续跳票 正式量产要到2024年_世界简讯
- 《星露谷物语》厂商新作全力开发中:零加班 所以慢-每日焦点
- GDC年度游戏提名公布:《老头环》《流浪》六项领跑-环球热消息
- 天弘丰利LOF: 天弘丰利债券型证券投资基金(LOF)2022年第4季度报告:重点聚焦
- 男子餐厅点海鲜、葱姜费占60%?餐厅:这是加工费
- 舒淇为林心如庆47岁生日 姐妹俩托腮扮嫩状态似少女
- 英国版《鱿鱼游戏》真人游戏被曝玩法苛刻 或陷集体诉讼|热点在线
- 男孩逛景区遇现实版“鹈鹕灌顶” 有攻击性需小心
- 环球观天下!让人一言难尽的NS“新操作系统”《nOS》发售
- 《鬼谷八荒》官方纪念EA上线两周年:开发已进入尾声
- 像素风小清新ADV《东京故事》上架steam 年内发售
- 全球视讯!利雅得胜利提高对莫德里奇的报价:一年豪掷4500万欧
- UE5版《塞尔达传说:时之笛》新视频 展示牧场地图
- 世界速读:《终结者2》T-1000噩梦成真 科学家开发固液变形机器人
- 辽宁上空惊现“三个太阳”幻日奇观 专家揭秘
- 返程提醒:带上健康,注意这几个细节
- 当前聚焦:郭富城、梁朝伟主演《风再起时》宣布提档:2月5日元宵节上映
- 卡牌战斗新游《Spell Siege》公开 AI辅助开发时间6小时
- 【全球新要闻】托比·马奎尔愿意再次扮演蜘蛛侠:我怎么会不想呢?
- 天天最资讯丨《荣耀战魂》新英雄公布 异乡人阵营再添女将
- 发售1天Steam好评如潮 三上真司音游《Hi-Fi Rush》GOTY预定-天天快看点
- 世界头条:DC《雷霆沙赞2》新预告:少年大战“龙妈”卡丽熙
- 《最终幻想:节奏剧场》新系统情报 2月16日发售-今日讯
- 春节假期接近尾声 假期返程小高峰将出现