0

Я пытаюсь создать базовую службу REST, защищенную Spring Security, с аутентификацией и авторизацией OAuth 2.0.Внедрение Spring Security Oauth без конфигурации XML

Я пытаюсь ограничить задействованные элементы, вместо того, чтобы копировать в XML-конфигурацию Spring Security Oath XML, основанную на Spring Beans, Spring MVC и т. Д. Я напрямую использую классы Oauth Spring Security.

Я попал в ловушку при попытке получить токен доступа из/oauth/token. Я, вероятно, пропустил что-то основное, но и Spring Security, и Spring Security Oauth сложно оборачивать вокруг себя, и я не могу найти ни одного примера или учебника, который не требует использования дополнительных фреймворков.

Может ли кто-нибудь увидеть, где я ошибаюсь?

RestService.java

@Path("/members") 
public class RestService { 

    @Secured({"ROLE_USER"}) 
    @GET 
    @Path("/{id}") 
    @Produces(MediaType.TEXT_PLAIN) 
    public Response readMember(@PathParam("id") String id) { 

     String output; 
     if(Integer.valueOf(id) < members.size()) 
     { 
      output = members.get(Integer.valueOf(id)).toString(); 
     } 
     else 
     { 
      output = "No such member."; 
     } 

     return Response.status(200).entity(output).build(); 
    } 
} 

OAuthServices.java

public class OAuthServices { 

    static private DefaultTokenServices tokenServices = new DefaultTokenServices(); 
    static private InMemoryClientDetailsService clientDetailsService = new InMemoryClientDetailsService(); 

    static { 
     Map<String, ClientDetails> clientDetailsStore = new HashMap<String, ClientDetails>(); 
     BaseClientDetails clientDetails = new BaseClientDetails("client", "resource", null, null, "read,write"); 
     clientDetailsStore.put("client", clientDetails); 
     clientDetailsService.setClientDetailsStore(clientDetailsStore); 
    } 

    public static DefaultTokenServices getTokenServices() { 
     return tokenServices; 
    } 

    public static InMemoryClientDetailsService getClientDetailsService() { 
     return clientDetailsService; 
    } 
} 

SecurityConfig.java

@EnableAuthorizationServer 
@EnableWebSecurity 
@Configuration 
@EnableGlobalMethodSecurity(securedEnabled=true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter implements AuthorizationServerConfigurer { 

    @Configuration 
    protected static class AuthenticationConfiguration extends 
      GlobalAuthenticationConfigurerAdapter { 

     @Override 
     public void init(AuthenticationManagerBuilder auth) throws Exception { 
      auth 
        .inMemoryAuthentication() 
        .withUser("user").password("password").roles("USER") 
        .and() 
        .withUser("admin").password("password").roles("USER", "ADMIN"); 
     } 

    } 

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer security) 
      throws Exception { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) 
      throws Exception { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) 
      throws Exception { 
     // TODO Auto-generated method stub 

    } 
} 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <servlet> 
     <servlet-name>jersey-helloworld-servlet</servlet-name> 
     <servlet-class> 
        org.glassfish.jersey.servlet.ServletContainer 
       </servlet-class> 
       <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value>com.excentus.springsecurity.rest.test</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>jersey-helloworld-servlet</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
</web-app> 
+0

Это очень много кода, чтобы ожидать, что люди просмотрят. Я предлагаю более кратко изложить вашу проблему, если это возможно. –

+0

Я думал, что было бы полезно иметь его там, чтобы ссылаться при необходимости, хотя большая часть его не должна быть релевантной. Я могу сократить его, хотя если это нахмурилось. –

ответ

0

Я вижу 2 ошибки (может быть, не всю историю).

  1. Вы используете web.xml, но там нет фильтра безопасности весны. Это код котельной плиты, но вы должны это сделать (если вы не переключитесь на более современный способ написания вашего приложения с Spring Boot, например). Пример (из docs):

    springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy

    springSecurityFilterChain /*

  2. Вы реализовали AuthorizationServerConfigurer, но не реализован какой-либо из его методов. Как минимум вам необходимо предоставить информацию о клиенте, например. (от [интеграционные тесты (https://github.com/spring-projects/spring-security-oauth/blob/master/tests/annotation/vanilla/src/main/java/demo/Application.java)):

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
        clients.inMemory() 
         .withClient("my-trusted-client") 
          .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit") 
          .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT") 
          .scopes("read", "write", "trust") 
          .resourceIds("oauth2-resource") 
          .accessTokenValiditySeconds(60); 
    } 
    

Ваш статический удобный класс OAuthServices также вид анти шаблон, но он не сломает ничего (я не вижу его использовать в любом месте либо, но, возможно, пропустили это).