使用访问令牌

时间:2017-07-09 09:02:56

标签: spring spring-boot spring-security-oauth2

我正在使用spring boot实现OAuth2。并按照这个例子进行了相同的操作 Spring-oauth2-jpa-example

Video Tutorial

实施后我已成功生成访问令牌。但问题是当我尝试访问我的案例/ api中的受保护资源时。我找不到404了。

主要方法

package com.gatimaanBoot;

import java.util.Arrays;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;

import com.gatimaanBoot.security.UserRepository;



@SpringBootApplication
public class GatimaanBootApplication {

    @Autowired
    private PasswordEncoder passwordEncoder;

    public static void main(String[] args) {
        System.out.println("booting....");
        SpringApplication.run(GatimaanBootApplication.class, args);
    }

/*  @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {

            System.out.println("Let's inspect the beans provided by Spring Boot:");

            String[] beanNames = ctx.getBeanDefinitionNames();
            Arrays.sort(beanNames);
            for (String beanName : beanNames) {
                //System.out.println(beanName);
            }

        };
    }*/

    /**
     * Password grants are switched on by injecting an AuthenticationManager.
     * Here, we setup the builder so that the userDetailsService is the one we coded.
     * @param builder
     * @param repository
     * @throws Exception
     */

    @Autowired
    public void authenticationManager(AuthenticationManagerBuilder builder, UserRepository repository, com.gatimaanBoot.security.service.UserService service) throws Exception {
        //Setup a default user if db is empty
        if (repository.count()==0)
            service.save(new com.gatimaanBoot.security.entities.User("user", "user", Arrays.asList(new com.gatimaanBoot.security.entities.Role("USER"), new com.gatimaanBoot.security.entities.Role("ACTUATOR"))));
        builder.userDetailsService(userDetailsService(repository)).passwordEncoder(passwordEncoder);
    }


    /**
     * We return an instance of our CustomUserDetails.
     * @param repository
     * @return
     */
    private UserDetailsService userDetailsService(final UserRepository repository) {
        return username -> new CustomUserDetails(repository.findByUsername(username));
    }   
}

AuthorizationServer

/**
*  Copyright 2017 Duronto Technology (P) Limited . All Rights Reserved.
*  Duronto Technology PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package com.gatimaanBoot.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;

/**
 *  
 *  @version     1.0, 09-Jul-2017
 *  @author Nikhil
 */
/**
 * Configures the authorization server.
 * The @EnableAuthorizationServer annotation is used to configure the OAuth 2.0 Authorization Server mechanism,
 * together with any @Beans that implement AuthorizationServerConfigurer (there is a handy adapter implementation with empty methods).
 */
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private PasswordEncoder passwordEncoder;

    /**
     * Setting up the endpointsconfigurer authentication manager.
     * The AuthorizationServerEndpointsConfigurer defines the authorization and token endpoints and the token services.
     * @param endpoints
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

    /**
     * Setting up the clients with a clientId, a clientSecret, a scope, the grant types and the authorities.
     * @param clients
     * @throws Exception
     */
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory().withClient("my-trusted-client")
                .authorizedGrantTypes("password","authorization_code","implicit")
                .authorities("ROLE_CLIENT","ROLE_TRUSTED_CLIENT").scopes("read","write","trust")
                .resourceIds("oauth2-resource").accessTokenValiditySeconds(5000).secret("secret");
    }

    /**
     * We here defines the security constraints on the token endpoint.
     * We set it up to isAuthenticated, which returns true if the user is not anonymous
     * @param security the AuthorizationServerSecurityConfigurer.
     * @throws Exception
     */
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
    }


}

ResourceServer

package com.gatimaanBoot.security;

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;

@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {


    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.headers().frameOptions().disable().and()
        .authorizeRequests()
        .antMatchers("/").permitAll()
        .antMatchers("/api/**").authenticated();
}

}

Application.properties

#Application Path

server.contextPath = /gatimaanBoot

security.oauth2.resource.filter-order = 3


# Database
spring.datasource.driver = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/train?zeroDateTimeBehavior=convertToNull
spring.datasource.username = root
spring.datasource.password = root

# Hibernate
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.show_sql= true
spring.jpa.properties.hibernate.hbm2ddl.auto= update
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

控制器

/**
 *  Copyright 2017 Duronto Technology (P) Limited . All Rights Reserved.
 *  Duronto Technology PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.gatimaanBoot.station.controller;

    /**
     *  
     *  @version     1.0, 24-Feb-2017
     *  @author Deepak Bisht
     *  @author Nikhil Mishra
     *  
     *  
     */
    import java.util.ArrayList;
    import java.util.List;

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;

    import com.gatimaanBoot.station.dto.StationResponseDTO;
    import com.gatimaanBoot.station.model.Station;
    import com.gatimaanBoot.station.services.StationService;

    @Controller
    @RequestMapping("/api/")
    public class StationController {

        private static final Logger LOGGER = LoggerFactory.getLogger(StationController.class);
        @Autowired
        StationService stationService;

        // get data for particular station
        @RequestMapping(value = "/v1.0/station/{stationCode}/", method = RequestMethod.GET)
        public @ResponseBody Station getStation(@PathVariable String stationCode) {
            Station station = null;
            try {
                station = stationService.getStation(stationCode);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return station;
        }

        /* Getting List of stations in Json format in pagination */
        @RequestMapping(value = "/v1.0/station/", method = RequestMethod.GET)
        public @ResponseBody List<Station> getStationList(
                @RequestParam(value = "page", required = false, defaultValue = "0") int page) {
            List<Station> stationList = null;
            try {
                stationList = stationService.getStationList(page);

            } catch (Exception e) {
                LOGGER.debug("Station Controller : " + e.getMessage());
                e.printStackTrace();
            }

            return stationList;
        }

        // insert new station
        @RequestMapping(value = "/v1.0/station/", method = RequestMethod.POST)
        public @ResponseBody StationResponseDTO insertStation(@RequestBody Station station) {
            StationResponseDTO stationDTO = null;
            try {
                stationDTO = stationService.insertStation(station);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return stationDTO;
        }

        // insert new station
        @RequestMapping(value = "/v1.0/station/", method = RequestMethod.PUT)
        public @ResponseBody StationResponseDTO updateStation(@RequestBody Station station) {
            StationResponseDTO stationDTO = null;
            try {
                stationDTO = stationService.updateStation(station);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return stationDTO;
        }

        // delete a station
        @RequestMapping(value = "/v1.0/station/", method = RequestMethod.DELETE)
        public @ResponseBody StationResponseDTO deleteStation(@RequestBody Station station) {
            StationResponseDTO stationDTO = null;
            try {
                stationDTO = stationService.deleteStation(station);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return stationDTO;
        }

        @RequestMapping(value = "/v1.0/station/list/", method = RequestMethod.POST)
        public @ResponseBody List<Station> getTrainList(@RequestBody ArrayList<String> stationList) {
            return stationService.getStationListBulk(stationList);
        }

    }

enter image description here

感谢。

0 个答案:

没有答案