zoukankan      html  css  js  c++  java
  • spring security oauth2 jwt 认证和资源分离的配置文件(java类配置版)

    最近再学习spring security oauth2。下载了官方的例子sparklr2和tonr2进行学习。但是例子里包含的东西太多,不知道最简单最主要的配置有哪些。所以决定自己尝试搭建简单版本的例子。学习的过程中搭建了认证和资源在一个工程的例子,将token存储在数据库的例子等等 。最后做了这个认证和资源分离的jwt tokens版本。网上找了一些可用的代码然后做了一个整理, 同时测试了哪些代码是必须的。可能仍有一些不必要的代码在,欢迎大家赐教。

    一.创建三个spring boot 工程,分别添加必要的依赖。认证和资源的工程需要添加依赖        <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-jwt</artifactId>
                <version>1.0.7.RELEASE</version>
            </dependency>

    二资源端工程的资源配置文件:

    @Configuration
    @EnableResourceServer
    public class OAuth2ResourceService extends ResourceServerConfigurerAdapter {
        private static final String SPARKLR_RESOURCE_ID = "apple";

        @Override
        public void configure(ResourceServerSecurityConfigurer resources) {
            resources.tokenServices(tokenServices()).resourceId(SPARKLR_RESOURCE_ID);
        }
        @Bean
        public TokenStore tokenStore() {
            return new JwtTokenStore(accessTokenConverter());
        }
        @Bean
        public JwtAccessTokenConverter accessTokenConverter() {
            JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
            converter.setSigningKey("123");
            return converter;
        }
        @Bean
        @Primary
        public DefaultTokenServices tokenServices() {
            DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
            defaultTokenServices.setTokenStore(tokenStore());
            return defaultTokenServices;
        }

        @Override
        public void configure(HttpSecurity http) throws Exception {
            // @formatter:off
                http
                    .authorizeRequests()
                    .antMatchers("/hello").access("#oauth2.hasScope('read') or (!#oauth2.isOAuth() and hasRole('ROLE_USER'))");  
            // @formatter:on
        }
    }

    安全配置文件:

    @Configuration
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
             http
                .authorizeRequests()
                    .antMatchers("/hello").hasRole("USER")
                    .and().csrf().disable()
                    .formLogin().loginPage("/login").failureUrl("/login-error");
        }
        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth
                .inMemoryAuthentication()
                    .withUser("hello").password("123").roles("USER");
        }
    }

    三 认证端工程的认证配置文件:

    @Configuration
    @EnableAuthorizationServer
    public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {
        private static final String SPARKLR_RESOURCE_ID = "apple";
        
        int accessTokenValiditySeconds = 3600;

        @Autowired
        @Qualifier("authenticationManagerBean")
        private AuthenticationManager authenticationManager;
        
           @Bean
            public JwtAccessTokenConverter accessTokenConverter() {
                JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
                converter.setSigningKey("123");
                return converter;
            }

        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {

            // @formatter:off
            clients.inMemory().withClient("tonr")
                         .resourceIds(SPARKLR_RESOURCE_ID)
                         .authorizedGrantTypes("authorization_code", "implicit")
                         .authorities("ROLE_CLIENT")
                         .scopes("read", "write")
                         .secret("secret")
                         .accessTokenValiditySeconds(accessTokenValiditySeconds);
            // @formatter:on
        }
        //jdbc
    //    @Bean
    //    public DataSource jdbcTokenDataSource(){
    //        DriverManagerDataSource dataSource = new DriverManagerDataSource();
    //        dataSource.setDriverClassName("com.MySQL.jdbc.Driver");
    //        dataSource.setUrl("jdbc:mysql://localhost/test");
    //        dataSource.setUsername("root");
    //        dataSource.setPassword("root");
    //        return dataSource;
    //    }
        
        @Bean
        public TokenStore tokenStore() {
    //        return new InMemoryTokenStore();
    //        return new JdbcTokenStore(jdbcTokenDataSource());
             return new JwtTokenStore(accessTokenConverter());
        }

        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
            endpoints.tokenStore(tokenStore())
            .authenticationManager(this.authenticationManager)
            .accessTokenConverter(accessTokenConverter());
        }
           @Bean
            @Primary
            public DefaultTokenServices tokenServices() {
                DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
                defaultTokenServices.setTokenStore(tokenStore());
                defaultTokenServices.setSupportRefreshToken(true);
                return defaultTokenServices;
            }
    }

    spring security安全配置文件:

    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
             http
                .authorizeRequests()
                .antMatchers("/css/**", "/index").permitAll()
                .and()
                .csrf()
                    .requireCsrfProtectionMatcher(new AntPathRequestMatcher("/oauth/authorize"))
                    .disable()
                    .formLogin().loginPage("/login").failureUrl("/login-error");
        }
        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth
                .inMemoryAuthentication()
                    .withUser("hello").password("123").roles("USER");
        }
        @Override
        @Bean
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }
    }

    四 客户端工程的配置文件:

    @Configuration
    @EnableOAuth2Client
    public class ResourceConfiguration {

        @Bean
        public OAuth2ProtectedResourceDetails hello() {
            AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails();
            details.setId("hello");
            details.setClientId("tonr");
            details.setClientSecret("secret");
            details.setAccessTokenUri("http://localhost:8083/auth/oauth/token");//认证服务器地址+/oauth/token
            details.setUserAuthorizationUri("http://localhost:8083/auth/oauth/authorize");//认证服务器地址+/oauth/authorize
            details.setScope(Arrays.asList("read", "write"));
            return details;
        }

        @Bean
        public OAuth2RestTemplate helloRestTemplate(OAuth2ClientContext oauth2Context) {//客户端的信息被封装到OAuth2RestTemplate用于请求资源
            return new OAuth2RestTemplate(hello(), oauth2Context);
        }
    }

    在业务逻辑的serviceImp类中 注入helloRestTemplate 然后:

        @Autowired
        private RestOperations helloRestTemplate

    public String getDataFromResoureServer() {;

    String data= helloRestTemplate.getForObject(URI.create("http://localhost:8080/resource/hello"), String.class);//请求资源服务器资源的路径

    return data;

    }

    spring security安全配置文件:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/css/**", "/index").permitAll()      
                    .and()
                .formLogin()
                    .loginPage("/login").failureUrl("/login-error");    
        }

        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth
                .inMemoryAuthentication()
                    .withUser("insecure").password("123").roles("USER");
        }
    }

    http://blog.csdn.net/u010139801/article/details/68484090

  • 相关阅读:
    GitHub之fetch:更新fork后的项目
    实验二 结对编程 第一阶段
    博客园之鼠标点击特效
    博客园之鼠标粒子吸附特效
    实验五 单元测试
    实验四 代码评审
    第三次实验 UML 建模工具的安装与使用
    结对编程(阶段二)
    结对编程第一阶段
    实验一 GIT 代码版本管理
  • 原文地址:https://www.cnblogs.com/softidea/p/7045801.html
Copyright © 2011-2022 走看看