文档章节

oauth2.0 实现spring cloud nosession

冷冷gg
 冷冷gg
发布于 2017/08/28 08:53
字数 756
阅读 3001
收藏 0

拓扑

上一篇博客使用自定义jwt实现spring cloud nosession,过程稍微比较复杂,依赖的是我们自己控制token生成、校验。 那么这一篇文章将使用spring cloud 和 spring-security-oauth2 做一个无缝集成,实现nosession,和权限控制。

为了快速的实现目标效果,拓扑结构如上图,我们将采用 InMemory的形式实现,相关换成JDBC实现位置,我会在文章中说明,主要看代码的注释。

auth-server

认证实现


@Configuration
@EnableAuthorizationServer
class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    @Autowired
    private AuthenticationManager authenticationManager;
    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager).tokenStore(tokenStore()).userDetailsService(userDetailsService);
    }
    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
        oauthServer.tokenKeyAccess("permitAll()");
    }
    //可以改成JDBC从库里读或者其他方式。
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("browser")
                .authorizedGrantTypes("authorization_code", "refresh_token", "password")
                .scopes("ui")
                .and()
                .withClient("resource-server")
                .secret("root")
                .authorizedGrantTypes("client_credentials", "refresh_token")
                .scopes("server");
    }
    
    //这里配置的配置可以改成 jdbc redis 等其他方式
    @Bean
    public InMemoryTokenStore tokenStore() {
        return new InMemoryTokenStore();
    }
}

// security配置主要是userDetailsService 

@Configuration
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.anonymous().disable()
                .authorizeRequests()
                .anyRequest().authenticated();
    }
}

resource-server

关于为什么要配置loadBalancerInterceptor这个bean 我会在这篇文章总结部分说明

@SpringBootApplication
@EnableEurekaClient
@EnableResourceServer
public class ResourceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ResourceApplication.class, args);
    }
    @Bean
    LoadBalancerInterceptor loadBalancerInterceptor(LoadBalancerClient loadBalance) {
        return new LoadBalancerInterceptor(loadBalance);
    }
}

还有一个最重要的,就是我们受保护的资源。。

@RestController
public class ResourceController {
    @GetMapping("/getResource")
    public String getResource(Principal principal) {
        return "SUCCESS,授权成功拿到资源啦.当前用户:" + principal.getName();
    }
}

配置application.yml

security:
  sessions: stateless
  oauth2:
    resource:
      loadBalanced: true 
      user-info-uri: http://gateway-server/uaa/user
      prefer-token-info: false
      service-id: resource-server

gateway 配置

zuul:
  ignored-services: '*'
  routes:
    auth-server:
      path: /uaa/**
      serviceId: auth-server
      sensitiveHeaders:
      strip-prefix: false

    resource-server:
      path: /demo/**
      serviceId: resource-server
      sensitiveHeaders:
      strip-prefix: false

运行使用

服务端口
gateway-server6666
auth-server7777
resource-server8888
eureka-serverhttp://eureka.didispace.com/eureka/

通过网关访问auth-server 获取access-token


//curl 不会用的可以参考文章总结里面 Rest Client 那个报文工具。
// 这里的账户是在 auth-server里面写死的,service实现里面。
 curl -H "Authorization:Basic YnJvd3Nlcjo=" -d "grant_type=password&scope=ui&username=123&password=456" localhost:6666/uaa/oauth/token
 
   
 {"access_token":"c8df8942-f032-4403-92fc-f23019819da9","token_type":"bearer","refresh_token":"993a94b4-5335-4f0a-9981-e1ad4e4776a8","expires_in":43199,"scope":"ui"}

通过access-token 访问受保护的资源

curl -H "Authorization:Bearer c8df8942-f032-4403-92fc-f23019819da9" localhost:6666/demo/getResource

SUCCESS,授权成功拿到资源啦.当前用户:123

片尾总结

  1. 坑。自定义对象的时候,默认使用的加密是PlaintextPasswordEncoder。如果使用其他,记得用对应的工具类处理一下密码再插入。
  2. 关于oauth server 认证的loadBalanced 设置。
security:
  sessions: stateless
  oauth2:
    resource:
      loadBalanced: true  #设置这个才可以使用eureka的服务名,配合loadBalancerInterceptor bean。

3.关于CURL 工具 可以用 Git Bash ,提供了curl 工具的。或者chrome里面这个插件挺好用。 image

源码

springcloud-security-oauth-server
springcloud-security-oauth-resource
springcloud-security-oauth-gateway

这个三个模块

© 著作权归作者所有

共有 人打赏支持
冷冷gg
粉丝 432
博文 113
码字总数 52275
作品 1
潍坊
UI设计师
私信 提问
加载中

评论(6)

无言的结局
无言的结局
请问楼主怎么解决多人同时登陆一个账号的呀?
无言的结局
无言的结局
这样的话 只要用户拿到同一个token 就可以同时登陆一个账号咯?
冷冷gg
冷冷gg

引用来自“yangxiufeng”的评论

博主,我获取access_token成功后,去获取资源一直报invalid_token。PS:已经确定获取access_token成功并用access_token去请求资源,access_token应该不会错。
http://jsonwebtoken.io/ 用这个 工具解析一下 你的accessToken
yangxiufeng
yangxiufeng
博主,我获取access_token成功后,去获取资源一直报invalid_token。PS:已经确定获取access_token成功并用access_token去请求资源,access_token应该不会错。
晓野先生
晓野先生
不错
冷冷gg
冷冷gg
服务 | 端口 ---|--- gateway-server | 6666 auth-server | 7777 resource-server | 8888 eureka-server | http://eureka.didispace.com/eureka/ 不知道这个md 表格有什么问题,文章里面就是显示不了。
整合spring cloud云架构 - SSO单点登录之OAuth2.0 登出流程(3)

上一篇我根据框架中OAuth2.0的使用总结,画了一个根据用户名+密码实现OAuth2.0的登录认证的流程图,今天我们看一下logout的流程: 我这里只是简单写了一些登出的代码,我们会在后面的文章中详...

itcloud
06/14
0
0
整合spring cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的登录认证)...

明理萝
07/04
0
0
Spring Cloud云架构 - SSO单点登录之OAuth2.0 登出流程(3)

上一篇我根据框架中OAuth2.0的使用总结,画了一个根据用户名+密码实现OAuth2.0的登录认证的流程图,今天我们看一下logout的流程: 我这里只是简单写了一些登出的代码,我们会在后面的文章中详...

明理萝
06/07
0
0
基于 Spring Cloud 的企业级认证与授权 - pig-cloud

基于Spring Cloud、Spring Security Oauth2.0开发企业级认证与授权,提供常见服务监控、链路追踪、日志分析、缓存管理、任务调度等实现。 特点 业务模块不涉及oauth2.0,认证鉴权全部在网关模...

冷冷gg
01/07
0
3
整合spring cloud云架构 - 根据token获取用户信息

上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: 我这里只是简单写了一些登出的代码,我们会在后面的文章...

明理萝
07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

网站老被劫持快照跳转怎么办

最近很多公司的网站被劫持跳转到了bo彩、cai票网站上去,客户从百度点击进去会跳转,直接输入网站的域名不会跳转,网站快照也被劫持成bo彩的内容,site查看网站在百度的收录也出现问题,收录...

网站安全
16分钟前
4
0
给自己灌鸡汤

前言 看极客时间的《数据结构与算法之美》,中间有一篇文章是在说怎么坚持学习的,摘抄一些片段过来,激励自己。 https://time.geekbang.org/column/article/69607 致使你掉队的原因 一个人在...

grace_233
18分钟前
2
0
如何在网络视听行业建一扇内容安全大门?

在人工智能飞速发展的三年里,整个网络视听产业数字化发展速度非常迅猛。大数据作为如今这个时代的产物,正不断推动整个产业的发展。网络视听行业中存在海量的数据,比如视频内容、视频浏览量...

阿里云官方博客
28分钟前
2
0
云安全简史

课程介绍: DT时代我们每个人的生活在不知不觉中与云计算发生了千丝万缕的联系,起床、吃饭、出行、社交、工作、娱乐、购物等大多数应用都在云上,然而安全事件频发时刻在为我们敲响警钟,面对...

mcy0425
29分钟前
2
0
数字IT基础-数据采集总线

摘要: 日志服务是阿里自产自用的产品,在双十一、双十二和新春红包期间承载阿里云/蚂蚁全站、阿里电商板块、云上几千商家数据链路,每日处理来自百万节点几十PB数据,峰值流量达到每秒百GB,...

阿里云云栖社区
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部