zoukankan      html  css  js  c++  java
  • Springboot2.0 + OAuth2.0之密码模式之认证资源分离

    综述:Springboot2.0 + OAuth2.0之密码模式之单项目集成 中讲了密码模式,但是其认证和资源都在同一个项目,是不是有点混乱。于是乎,为啥不做认证和资源分离呢?Just do it...

    一、认证服务器

    当然认证服务器还是用之前搭建的那个,只是需要将资源配置注释,如下修改即可:

    package com.liuzj.oauth2server.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
    import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
    
    /**
     * 这个类表明了此应用是OAuth2 的资源服务器,此处主要指定受资源服务器保护的资源链接
     * 默认情况下spring security oauth2的http配置会被WebSecurityConfigurerAdapter的配置覆盖
     *
     * @author liuzj
     * @date 2019-01-15
     */
    //@Configuration
    //@EnableResourceServer
    public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    
        @Override
        public void configure(HttpSecurity http) throws Exception {
    
            http.csrf().disable()//禁用了csrf(跨站请求伪造)功能
                    .authorizeRequests()//限定签名成功的请求
                    //必须认证过后才可以访问;注意:hasAnyRole 会默认加上ROLE_前缀,而hasAuthority不会加前缀
                    .antMatchers("/decision/**","/govern/**").hasAnyRole("user")
                    .antMatchers("/admin/**").hasRole("admin")
                    .antMatchers("/test/**").authenticated()
                    // 免验证请求
                    .antMatchers("/oauth/**").permitAll();
        }
    
    }

    二、资源服务

    (1)项目结构如下(Maven项目)

    (2)配置资源相关配置

    package com.liuzj.resource.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
    import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
    import org.springframework.security.oauth2.provider.token.RemoteTokenServices;
    
    /**
     * 资源服务器的配置,这个类表明了此应用是OAuth2 的资源服务器(访问资源都需要认证),此处主要指定了受资源服务器保护的资源链接
     *
     * @author liuzj
     * @date 2019-01-15
     */
    @Configuration
    @EnableResourceServer
    public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    
    
        @Primary
        @Bean
        public RemoteTokenServices tokenServices() {
            final RemoteTokenServices tokenService = new RemoteTokenServices();
            tokenService.setCheckTokenEndpointUrl("http://localhost:8001/oauth/check_token");
            tokenService.setClientId("client");
            tokenService.setClientSecret("123456");
            return tokenService;
        }
    
        @Override
        public void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()//禁用了csrf(跨站请求伪造)功能
                    .authorizeRequests()//限定签名成功的请求
                    //必须认证过后才可以访问;注意:hasAnyRole 会默认加上ROLE_前缀,而hasAuthority不会加前缀
                    .antMatchers("/decision/**","/govern/**").hasAnyRole("user")
                    .antMatchers("/admin/**").hasRole("admin")
                    .antMatchers("/test/**").authenticated()
                    // 免验证请求
                    .antMatchers("/oauth/**").permitAll();
        }
    }

    这样资源配置就搞好了

    (3)进行测试

    同样,如果你直接访问则会提示你:此资源访问需要认证。所以得带上 token 进行访问:

    同样获取 token 然后带上 token 即访问成功!

  • 相关阅读:
    单例模式
    BeanFactory VS ApplicationContext
    java利用接口和适配器进行完全解耦参考《thinking in java》
    javascr*pt对象的创建相对java 怎样去创建了"类"*以及实例化对象
    实例化bean
    Spring AOP With AspectJ
    spring入门之环境搭建
    项目中ApplicationContext
    BeanFactory VS FactoryBean
    软开心法十四||软件改进
  • 原文地址:https://www.cnblogs.com/lzj123/p/10278848.html
Copyright © 2011-2022 走看看