2017-11-03 2 views
0

TARGETWarum ist die Autowired-Bean null?

Redirect Benutzer zur Homepage, wenn er versucht, Login-Seite zugreifen, wenn er bereits angemeldet ist.

ANSATZ

Redirect Benutzer auf Filterebene statt in Login-Controller.

SYSTEM DETAILS

JSF

Frühling Sicherheit

UrlRewriteFilter

DETAILS

Basierend auf dieser link ich eine Klasse erstellt haben Frühjahr s zugreifen icherheit und fragt, ob Benutzer angemeldet ist (ist nicht ein anonymer Benutzer):

public class SecurityContextAccessorImpl implements SecurityContextAccessor { 

    @Autowired 
    private AuthenticationTrustResolver authenticationTrustResolver; 

    public SecurityContextAccessorImpl() { 
    } 

    @Override 
    public boolean isCurrentAuthenticationAnonymous() { 
     final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
     return authenticationTrustResolver.isAnonymous(authentication); 
    } 
} 

Dann entwickeln ich einen Filter, die vorherige Klasse verwendet Benutzer umleiten:

@WebFilter 
@Component 
public class LoginFilter implements Filter { 

    @Autowired 
    private SecurityContextAccessor securityContextAccessor; 

    @Override 
    public void destroy() { 
     // TODO Auto-generated method stub 

    } 

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

     if(securityContextAccessor != null){ 
      if(securityContextAccessor.isCurrentAuthenticationAnonymous()){ 
       String contextPath = ((HttpServletRequest)request).getContextPath(); 
       ((HttpServletResponse)response).sendRedirect(contextPath + "/ASSDA/home/home"); 
      } 
     } 

     chain.doFilter(request, response); 
    } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
     // TODO Auto-generated method stub 

    } 

Filter in web.xml definiert sind nach der Feder und UrlRewrite:

<!-- ============== Spring security ============= --> 
    <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> 
<!-- ============== UrlRewriteFilter ============= --> 
    <filter> 
     <filter-name>UrlRewriteFilter</filter-name> 
     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 

    </filter> 
    <filter-mapping> 
     <filter-name>UrlRewriteFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

    <!-- ============== Login Filter ============= --> 
    <filter> 
     <filter-name>LoginFilter</filter-name> 
     <filter-class>es.assda.ged.web.controller.security.LoginFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>LoginFilter</filter-name> 
     <url-pattern>/login.xhtml</url-pattern> 
     <dispatcher>FORWARD</dispatcher> 
    </filter-mapping> 

Bohnen werden in entsprechenden applicationContext.xml

definiert
<beans:bean id="defaultTargetUrl" class="java.lang.String"> 
     <beans:constructor-arg value="/ASSDA/home/home" /> 
    </beans:bean> 

    <beans:bean id="authenticationTrustResolver" name="authenticationTrustResolver" class="org.springframework.security.authentication.AuthenticationTrustResolverImpl" /> 

<bean id="securityContextAccessor" name="securityContextAccessor" class="es.assda.ged.api.security.SecurityContextAccessorImpl" /> 

CURRENT VERHALTEN

Redirection tut gut und LoginFilter erreichen, aber autowired securityContextAccessor Variable nicht initialisiert wird. Ich denke, es ist nicht initialisiert, weil Bean-Authentifizierung TrustResolver ist null.

Auf der anderen Seite, wenn ich die autowired Variable securityContextAccessor im Login-Controller deklarieren, wird es korrekt injiziert.

Warum ist securityContextACcessor in LoginFilter leer und im Login-Controller korrekt instanziiert?

+1

Die Bohne sehen wahrscheinlich nicht gespritzt, weil es nicht hat es geschafft bis zum Frühling.Es könnte aufgrund des '@ WebFilters' sein, dass Ihr Filter vom JEE-Container verwaltet wird. –

Antwort

1

Es sieht so aus, als ob Sie Ihre Filter über Spring nicht instanziieren, so dass Sie keine Abhängigkeitsinjektion erhalten. Es sollte funktionieren DelegatingFilterProxy mit:

web.xml:

<filter> 
    <filter-name>springLoginFilter</filter-name><!-- Your filter bean in Spring --> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>LoginFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

applicationContext.xml:

<bean id="springLoginFilter" class="es.assda.ged.web.controller.security.LoginFilter" /> 

Auch ist Accessing Spring beans from servlet filters and tags