2016-07-22 5 views
0

Я пытался преобразовать следующую конфигурацию java конфигурации весны в конфигурацию xml;Облицовочные проблемы с конфигурацией XML Spring Security

Конфигурация Java;

package com.careapple.webservice.security.config; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.http.HttpMethod; 
import org.springframework.security.authentication.AuthenticationManager; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.config.http.SessionCreationPolicy; 
import org.springframework.security.core.userdetails.UserDetailsService; 
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 
import org.springframework.security.web.AuthenticationEntryPoint; 
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import com.careapple.webservice.security.filter.AuthenticationTokenFilter; 

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

    @Autowired 
    private UserDetailsService userDetailsService; 
    @Autowired 
    private AuthenticationEntryPoint authenticationEntryPoint; 


    @Autowired 
    public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { 
     authenticationManagerBuilder 
       .userDetailsService(userDetailsService) 
       .passwordEncoder(new BCryptPasswordEncoder()); 
    } 

    @Bean 
    @Override 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 


    @Bean 
    public AuthenticationTokenFilter authenticationTokenFilterBean() throws Exception { 
     AuthenticationTokenFilter authenticationTokenFilter = new AuthenticationTokenFilter(); 
     authenticationTokenFilter.setAuthenticationManager(super.authenticationManagerBean()); 
     return authenticationTokenFilter; 
    } 


    @Override 
    protected void configure(HttpSecurity httpSecurity) throws Exception { 
     httpSecurity 
       .csrf() 
       .disable() 
       .exceptionHandling() 
       .authenticationEntryPoint(authenticationEntryPoint) 
       .and() 
       .sessionManagement() 
       .sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
       .and() 
       .authorizeRequests() 
       .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 
       .antMatchers("/auth/**").permitAll() 
       .anyRequest().authenticated(); 

     // Custom JWT based authentication 
     httpSecurity 
       .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class); 
    } 
} 

Converted xml configuration; весна-security.xml

<?xml version="1.0" encoding="UTF-8"?> 
<bean:beans 
    xmlns:bean="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:c="http://www.springframework.org/schema/c" 
    xmlns="http://www.springframework.org/schema/security" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
     http://www.springframework.org/schema/security 
     http://www.springframework.org/schema/security/spring-security-4.0.xsd"> 

    <global-method-security secured-annotations="enabled"/> 

    <http realm="Protected API" 
     create-session="stateless" 
     entry-point-ref="authenticationEntryPoint" 
     authentication-manager-ref="authenticationManager"> 

     <csrf disabled="true"/> 

     <custom-filter ref="authenticationTokenFilter" position="FORM_LOGIN_FILTER"/> 

     <intercept-url pattern="/login/**" access="permitAll"/> 
     <intercept-url pattern="/" access="isFullyAuthenticated()"/> 
    </http> 


    <bean:bean id="authenticationEntryPoint" class="com.careapple.webservice.security.EntryPointUnauthorizedHandler"/> 

    <bean:bean id="userDetailService" class="com.careapple.webservice.security.service.UserDetailsServiceImpl"/> 

    <bean:bean name="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> 

    <authentication-manager id="authenticationManager"> 
     <authentication-provider user-service-ref="userDetailService"> 
      <password-encoder ref="bcryptEncoder"></password-encoder> 
     </authentication-provider> 
    </authentication-manager> 

    <bean:bean id="authenticationTokenFilter" class="com.careapple.webservice.security.filter.AuthenticationTokenFilter" 
     c:authenticationManager-ref="authenticationManager"/> 

</bean:beans> 

Я новичок весной безопасности, первое, что я хочу, есть я преобразовал Java конфиг правильно XML. Или я что-то пропустил.

Далее, если я запустил приложение с этим файлом xml, я получаю следующую ошибку;

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.filterChains': Cannot resolve reference to bean 'org.springframework.security.web.DefaultSecurityFilterChain#0' while setting bean property 'sourceList' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.DefaultSecurityFilterChain#0': Cannot resolve reference to bean 'authenticationTokenFilter' while setting constructor argument with key [3]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'authenticationTokenFilter' defined in ServletContext resource [/WEB-INF/spring-security.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities) 

Где authenticationTokenFilter обычай фильтр, который я использую, и он реализует UsernamePasswordAuthenticationFilter весны.

Это мой файл в формате web.xml;

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" version="3.0"> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring-security.xml</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/spring-servlet.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <filter> 
     <filter-name>authenticationTokenFilter</filter-name> 
     <filter-class>com.careapple.webservice.security.filter.AuthenticationTokenFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>authenticationTokenFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

</web-app> 

Я хочу тоже вещи сейчас, 1. Все ли мои настройки XML-файлы являются правильными. 2. Если да, то как исправить исключение, которое я получаю.

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

Редактировать: Это мой AuthenticationTokenFilter;

package com.careapple.webservice.security.filter; 

import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 

import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.http.HttpStatus; 
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 
import org.springframework.security.core.context.SecurityContextHolder; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.security.core.userdetails.UserDetailsService; 
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; 
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; 
import org.springframework.web.context.support.WebApplicationContextUtils; 

import com.careapple.webservice.security.TokenUtils; 
import com.careapple.webservice.util.AppConstant; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class AuthenticationTokenFilter extends UsernamePasswordAuthenticationFilter { 

    @Autowired 
    private TokenUtils tokenUtils; 

    @Autowired 
    private UserDetailsService userDetailsService; 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws IOException, ServletException{ 

     tokenUtils = WebApplicationContextUtils 
       .getRequiredWebApplicationContext(this.getServletContext()) 
       .getBean(TokenUtils.class); 
     userDetailsService = WebApplicationContextUtils 
       .getRequiredWebApplicationContext(this.getServletContext()) 
       .getBean(UserDetailsService.class); 

     HttpServletResponse resp = (HttpServletResponse) response; 
     resp.setHeader("Access-Control-Allow-Origin", "*"); 
     resp.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE, PATCH"); 
     resp.setHeader("Access-Control-Max-Age", "3600"); 
     resp.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, " + AppConstant.tokenHeader); 


     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     String authToken = httpRequest.getHeader(AppConstant.tokenHeader); 
     System.out.println("Token: " + authToken); 
     String username = this.tokenUtils.getUsernameFromToken(authToken); 
     System.out.println("Username: " + username); 

     if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { 
      UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); 
      System.out.println("inside first if"); 
      if (this.tokenUtils.validateToken(authToken, userDetails)) { 
        UsernamePasswordAuthenticationToken authentication = 
          new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); 
        authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpRequest)); 
        SecurityContextHolder.getContext().setAuthentication(authentication); 

      } 
     } 

      try { 
       chain.doFilter(request, response); 
      } catch (Exception e) { 
       Map<String, String> tokenExpired = new HashMap<>(); 
       tokenExpired.put("TokenExpired", "Authentication token expired, please login again"); 
       resp.setContentType("application/json"); 
       resp.setStatus(HttpStatus.FORBIDDEN.value()); 
       resp.getWriter().write(convertObjectToJson(tokenExpired)); 
      } 
    } 

    public String convertObjectToJson(Object object) throws JsonProcessingException { 
     if (object == null) { 
      return null; 
     } 
     ObjectMapper mapper = new ObjectMapper(); 
     return mapper.writeValueAsString(object); 
    } 
} 
+0

1. Нет это не так. 2. Сделайте свой собственный фильтр частью цепи фильтра безопасности пружины, а не простой файл, запустите web.xml. Также почему вы хотите, чтобы xml-конфигурация вместо java-based? Чаще всего наоборот. –

+0

Спасибо за ваш ответ, я новичок в весенней безопасности. Можете ли вы рассказать, как сделать пользовательскую часть фильтра пружинной цепи фильтра безопасности. Я не могу разместить приложение для работы на сервере с помощью java config, давая мне 404, поэтому я меняю конфигурацию на xml. Я даже разместил эти вопросы, но не смог получить от них решение; http://stackoverflow.com/questions/38507424/mixing-xml-and-java-config-for-spring-security – karthi

+0

http://stackoverflow.com/questions/38482009/getting-404-when-deploying-spring- mvc-web-application-to-live-serverarvixe – karthi

ответ

0

Ваш пользовательский фильтр аутентификации должен быть определен только на пружинно-security.xml файл, глядя на него, она должна быть тонкой.

На вашем web.xml вам необходимо удалить фильтр (это фильтр Spring Security, а не фильтр JavaEE) и добавить фильтр безопасности пружины. Сообщение об ошибке из Spring состоит в том, что он не может найти фильтр Spring Security и, таким образом, отказаться от синтаксического анализа файла pring-security.xml.

Так удалить фильтр из web.xml и добавить безопасность пружины с этими линиями, и все должно быть хорошо

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

С уважением,

Лоик

+0

Пробовал это, но получал ту же ошибку. – karthi

+0

Здравствуйте, снова прочитайте ошибку, с которой вы сталкиваетесь, и это базовая зависимость от зависимостей от весны: Ошибка создания компонента с именем «authenticationTokenFilter» ... Не удалось разрешить соответствующий конструктор ... Можете ли вы поделиться кодом вашего AuthenticationTokenFilter, очевидно, есть проблема с конструктором в нем, есть ли пустой конструктор в этом классе? – loicmathieu

+0

Я отредактировал мой вопрос с кодом AuthenticationTokenFilter. – karthi

Смежные вопросы