Use SpringSecurity alcançar OAuth2 servidor de autenticação separado servidor de recursos (modo License)

    serviço parte autorizada a recursos de clientes de acesso sem expor os clientes Senha: questões a serem abordadas

    Papel: proprietários de recursos, o aplicativo cliente (serviço de festa), servidor de autorização, os recursos do servidor

    Modo de Código de Autorização:: Modo a necessidade de autorização do cliente depois de obter um código de autorização para obter forma, verifique pelo serviço senha de partido novo, o mais seguro e mais complexa

               Modo Fácil: Os usuários não precisam um código de autorização para expor token retornado inseguro

               Modo Senha: o aplicativo cliente precisa a senha do proprietário do recurso. Caso de uso credível sob link completo

               Modo Cliente: nenhuma senha proprietário do recurso, é necessário apenas a verificação da senha aplicativo cliente, o servidor usa o servidor

       Este teste é principalmente padrão de código de registro de demonstração é dividido em aplicativos de servidor dois autorização e recursos do servidor, o acompanhamento vai continuar a estender a autorização para um único servidor e vários recursos do servidor.

Procedimento de teste

Criar um servidor de autorização na imagem seguinte, o pacote de servidor de autorização está estruturado da seguinte

1, utilizando o correspondente pom importação arquivo dependente introduzidos, principalmente, os seguintes dependências

1) SpringBoot de segurança e web,

2) SpringSecurity 的 OAuth2

arquivo pom da seguinte forma

 

<? xml version = "1.0" encoding = "UTF-8"?> 
<xmlns projeto = "http://maven.apache.org/POM/4.0.0" xmlns: xsi = "http: //www.w3 .org / 2001 / XMLSchema instância" 
         xsi: schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion> 4.0.0 </ modelVersion> 

    <groupId> io.spring2go </ groupId> 
    <artifactId> authcode-servidor </ artifactId> 
    <versão> 0.0.1-SNAPSHOT </ version> 
    <embalagem> jar </ embalagem> 

    <name> authcode-servidor </ name> 
    <description> projeto demo para a Primavera de inicialização </ description> 

    <pai> 
        <groupId> org. 
        <relativePath />springframework.boot </ groupId> 
        <artifactId> spring-boot-starter-parent </ artifactId>
        <version> 1.5.10.RELEASE </ version> <! - pai de pesquisa a partir do repositório ->
 </ parent> 
    <properties> 
        <project.build.sourceEncoding> UTF-8 </project.build.sourceEncoding> 
        <project .reporting.outputEncoding> UTF-8 </project.reporting.outputEncoding> 
        <java.version> 1,8 </java.version> 
    </ propriedades> 
    <dependências> 
        <dependência> 
            <groupId> org.springframework.boot </ groupId> 
            <artifactId> spring-boot-starter-segurança </ artifactId> 
        </ dependency> 
        <dependency> 
            <groupId> org.springframework.boot </ groupId> 
            <artifactId> spring-boot-starter-web </ artifactId>


        </ dependency> <! - para OAuth 2.0 ->
         
            <groupId> org.springframework.security.oauth </ groupId> 
            <artifactId> spring-security-oauth2 </ artifactId> 
        </ dependency> 
        <dependency> 
            <groupId> org.springframework.boot </ groupId> 
            <artifactId> spring-boot-starter-test </ artifactId> 
            <scope> test </ scope> 
        </ dependency> 
        <dependency> 
            <groupId> org.springframework.security </ groupId> 
            <artifactId> spring-security-test </ artifactId> 
            <scope> test </ scope>
        </ dependency> 
    </ dependencies> 
    <build>

         <dependency>


        <plugins>  
            <plug-in>
                <groupId> org.springframework.boot </ groupId> 
                <artifactId> spring-boot-maven-plugin </ artifactId> 
            </ plugin> 
        </ plugins> 
    </ build> 


</ project>

2 Modificar application.properties set senha do usuário

 

# Spring Security Definir
 security.user.name = bobo 
security.user.password = xyz

arquivos de inicialização SpringBoot 3 Faça

 

empacotar com.test.authcodeserver; 

importação org.springframework.boot.SpringApplication; 
importação org.springframework.boot.autoconfigure.SpringBootApplication; 

@SpringBootApplication 
AuthCodeServerApplication classe pública { 
    public static void main (String [] args) { 
        SpringApplication.run (AuthCodeServerApplication.class, args); 
    } 
}
4 Set Autorizado Código de serviço

 

 
     
empacotar com.test.authcodeserver.config; 
importação org.springframework.context.annotation.Bean; 
importação org.springframework.context.annotation.Configuration; 
importação org.springframework.context.annotation.Primary; 
importação org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; 
importação org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; 
importação org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; 
importação org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
importação org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; 
org.springframework.security.oauth2.provider.token.DefaultTokenServices importação;
importação org.springframework.security.oauth2.provider.token.TokenStore; 
importação org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore; 
importação org.springframework.security.oauth2.provider.token.store.JdbcTokenStore; 

@Configuration 
@EnableAuthorizationServer 
classe pública AuthCodeServerConfig estende AuthorizationServerConfigurerAdapter { 
@Override 
    pública configure void (última AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
        oauthServer.tokenKeyAccess ( "permitAll ()") 
                .checkTokenAccess ( "isAuthenticated ()"); 
    }
    @Override 
    configure public void (clientes ClientDetailsServiceConfigurer) 
            throws Exception {
         // JdbcClientDetailsService pode gerenciar dinamicamente os dados do cliente de banco de dados
         // http: // localhost :? 8080 / oauth / autorizar client_id = testclientid & redirect_uri = http: // localhost: 9001 / authCodeCallback & response_type = código read_userinfo & scope =
 clients.inMemory () 
                .withClient ( "testclientid") // clientId :( necessário) usado para identificar o cliente Id.
.secret ( "1234") // Segredo :( necessidade de um cliente confiável) código de segurança do cliente, se houver.
.redirectUris ( "HTTP: // localhost: 9001 / authCodeCallback") // aplicação cliente é responsável por obter o código de autorização Endpoint
 .authorizedGrantTypes ( "authorization_code") // modo Código de autorização
 .scopes ( "read_userinfo", " "); // escopo: para limitar o acesso a uma gama de clientes, se ela estiver vazia (o padrão), então o cliente tem acesso total para o intervalo.
} 

}

5 Iniciar serviço SpringBoot

6 cliente do servidor de autorização de acesso de serviço, visite o seguinte url Tonggu código de autorização

http: // localhost: 8080 / oauth / autorizar client_id = testclientid & redirect_uri = http: // localhost: 9001 / authCodeCallback & response_type = código & scope = read_userinfo

Após a conclusão do acesso irá redirecionar de volta para o cliente eo servidor retorna um código de autorização como um parâmetro, que localhost: 9001 é o aplicativo cliente

7 cliente usando o código de autorização para ter acesso à retornou símbolo

parâmetros de solicitação transmissão são os seguintes

url: http: // localhost: 8080 / oauth / símbolo

code = ifz2BV & grant_type = authorization_code & redirect_uri = http% 3A% 2F% 2Flocalhost% 3A9001 &% 2FauthCodeCallback escopo = read_userinfo

de dados simbicos obtido

 

{
access_token: "554338cd-cab0-4ba0-b5bf-3ebd55db3196"
token_type: "portador"
expires_in: 43.199
escopo: "read_userinfo"

}

Acima de servidor de autorização é simples para ser concluída, e vai fazer o seguinte servidor de recursos

 

-------------------------------------------------- ------------------------------------------------

 

servidor de recursos

estrutura de pacotes 0 recursos do servidor

Um servidor de autenticação de configuração do servidor de recursos, método de autenticação RemoteTokenServices recuperado para autenticar o token

 

empacotar com.test.resourceserver.config; 

importação org.springframework.beans.factory.annotation.Autowired; 
importação org.springframework.context.annotation.Bean; 
importação org.springframework.context.annotation.Configuration; 
importação org.springframework.context.annotation.Primary; 
importação org.springframework.security.config.annotation.web.builders.HttpSecurity; 
importação org.springframework.security.config.http.SessionCreationPolicy; 
importação org.springframework.security.core.AuthenticationException; 
importação org.springframework.security.oauth2.common.OAuth2AccessToken; 
importação org.springframework.security.oauth2.common.exceptions.InvalidTokenException;
importação org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; 
importação org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
importação org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; 
importação org.springframework.security.oauth2.provider.OAuth2Authentication; 
org.springframework.security.oauth2.provider.token.DefaultTokenServices importação; 
org.springframework.security.oauth2.provider.token.RemoteTokenServices importação; 
org.springframework.security.oauth2.provider.token.ResourceServerTokenServices importação; 
importação org.springframework.security.web.AuthenticationEntryPoint; 

importação javax.servlet.ServletException; 
importação javax.servlet.http.HttpServletRequest; 
importação javax.servlet.http.HttpServletResponse;
importação Java.io.IOException; //资源服务配置
 @Configuration 
@EnableResourceServer 
classe pública OAuth2ResourceConfig estende ResourceServerConfigurerAdapter {



    @Primary 
    @Bean 
    RemoteTokenServices públicas tokenServices () { 
        RemoteTokenServices finais tokenService = new RemoteTokenServices (); 
        tokenService.setCheckTokenEndpointUrl ( "http: // localhost: 8080 / oauth / check_token"); 
        tokenService.setClientId ( "testclientid"); 
        tokenService.setClientSecret ( "1234"); 
        voltar tokenService; 
    } 

    @Override 
    pública configure void (HttpSecurity http) throws Exception { // http.sessionManagement (). SessionCreationPolicy (SessionCreationPolicy.IF_REQUIRED)
 // .e ()
 // .authorizeRequests ()
 // .anyRequest ()


// .authenticated ()
 // .e ()
 // .requestMatchers ()
 // .antMatchers ( "/ api / **");
. http.sessionManagement () sessionCreationPolicy (. SessionCreationPolicy IF_REQUIRED ) 
                .e () 
                .authorizeRequests () anyRequest () permitAll ()..; 
    } 
}

2 fornecem uma interface API externa

 

empacotar com.test.resourceserver.api; 

importação org.springframework.http.ResponseEntity; 
importação org.springframework.security.core.context.SecurityContextHolder; 
importação org.springframework.security.core.userdetails.User; 
importação org.springframework.stereotype.Controller; 
importação org.springframework.web.bind.annotation.RequestMapping; 

@Controller 
classe pública UserController { //资源API
 @RequestMapping ( "/ api / userinfo") 
    ResponseEntity pública <UserInfo> getUserInfo () { 
        user String = (String) SecurityContextHolder.getContext () 
                .getAuthentication () getPrincipal (.); 
        Cordas email = usuário + "@ test.com";

   

        UserInfo userInfo = novo UserInfo (); 
        userInfo.setName (utilizador); 
        userInfo.setEmail (e-mail);
        retorno ResponseEntity.ok (userInfo); 
    } 

}
chamada getUserInfo

http: // localhost: 8004 / api / userinfo 

autorização: Portador 638aa01c-4ccd-4873-ab86-d46f22aea091

Retorna o servidor de recursos após o resultado da chamada

Neste ponto, uma chamada de recursos separado servidor servidor de recursos e autenticação é longo.

Acho que você gosta

Origin www.cnblogs.com/liboware/p/12535110.html
Recomendado
Clasificación