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?
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. –