Oauth2权限管理

T31权限管理

实现的工具 Oauth2

基于前后端的令牌的实现

Oauth2是什么

eg:小区让快递员进入小区的方法

1.远程开门 2.告诉密码 3.使用令牌

Oauth2权限管理_第1张图片
Oauth2权限管理_第2张图片

生活中的Oauth2的运用

eg:京东使用qq wx 的扫码授权登录

Oauth2权限管理_第3张图片

callback?code码可以换一次只能换一次令牌,这样解决了授权的问题,jd可以获得qq的用户数据

Oauth2权限管理_第4张图片

Oauth1不安全

Oauth2角色

Oauth2权限管理_第5张图片

Resource Owner 资源持有者是用户 “我” 我来授权认证

Client 京东

模式
Oauth2权限管理_第6张图片

授权码模式:最严谨最安全,一个码只能换一次令牌,拿着码也无用了,京东拿到码去换令牌,浏览器看不到码

简化模式:直接申请令牌 直接返回令牌(token),没有吧令牌存到服务器,不安全,浏览器的能看到,原因是静态的页面可能没有服务器保存

密码模式:客户端和服务器高度信任,一个公司,甚至一个项目,T31这种前后端高度的信任,可以用密码

客户端模式:都是自己的报名字直接要

Oauth2权限管理_第7张图片

前后端是跨域的,前端访问后端,就要拿到用户名和密码,

为什么用Oauth2

Oauth2权限管理_第8张图片

Oauth2权限管理_第9张图片

淘宝使用的 jwt

Oauth2权限管理_第10张图片

授权码拿令牌,根据令牌访问不同的服务

Oauth2权限管理_第11张图片

前后端分离,分体项目自然是跨域的,后段的微服务没有跨域但是也有可能需要令牌携带权限

跨域:域名 端口 协议

移动端没有cookie

token大于session

Oauth2怎么用

Oauth2权限管理_第12张图片

Oauth2权限管理_第13张图片

资源服务器拿到浏览器传来的令牌,要和授权服务器颁发的令牌做比较

要使用Oauth进行权限认证,需要配合Security放行相关资源

@Configuration
@EnableWebSecurity
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    //数据库
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {    //auth.inMemoryAuthentication()
        auth.inMemoryAuthentication()
                .withUser("lxs")
                .password("{noop}123") //使用springsecurity5,需要加上{noop}指定使用NoOpPasswordEncoder给DelegatingPasswordEncoder去校验密码
                .roles("admin");
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        //放行静态资源
        //解决静态资源被拦截的问题
//        web.ignoring().antMatchers("/asserts/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //默认放行的地址,由这些节点发起认证
        http
                .formLogin().permitAll()
                .and().logout().logoutUrl("/logout").logoutSuccessUrl("/")
                .and().authorizeRequests().antMatchers("/oauth/**", "/login/**", "/logout/**", "/api/**").permitAll()
                .anyRequest().authenticated()
                // 关闭跨域保护;
                .and().csrf().disable();
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

}

Oauth2权限管理_第14张图片

Oauth2配置继承ResourceServerConfigurerAdapter

Oauth2权限管理_第15张图片

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    //没有令牌都不能访问
    http.authorizeRequests().antMatchers("/**").authenticated();
    // 禁用CSRF
    http.csrf().disable();
  }
}

Oauth2权限管理_第16张图片

授权码模式

Oauth2权限管理_第17张图片

Oauth2权限管理_第18张图片

Oauth2权限管理_第19张图片

得到了code 现在需要的是拿码换令牌 是post请求

Oauth2权限管理_第20张图片
Oauth2权限管理_第21张图片

“1799” 是过了1s 加上正好 30分钟

重新申请 已经失效了码

Oauth2权限管理_第22张图片

目前通过地址栏传令牌是不安全的,还可以通过bearer传令牌

简化模式

Oauth2权限管理_第23张图片

简化了授权模式 直接访问就返回了令牌和code

此时关闭服务器 就失效了

Oauth2权限管理_第24张图片

密码模式

Oauth2权限管理_第25张图片

没有浏览器了 直接发送密码

Oauth2权限管理_第26张图片

浏览器不能访问

Oauth2权限管理_第27张图片

客户端模式

Oauth2权限管理_第28张图片
Oauth2权限管理_第29张图片

你可能感兴趣的:(T31,安全)