Como faço para uma segurança preguiçosa da primavera?
-
22-09-2019 - |
Pergunta
Como não instancie a segurança da primavera até que eu precise?
Estou usando o Google App Engine para que o tempo de inicialização do meu aplicativo da web seja importante. Às vezes, quando um usuário solicita uma página, ele deve esperar o tempo todo para o meu aplicativo da web instanciar antes de obter uma resposta (isso é chamado de solicitação de carregamento).
Certas páginas do meu aplicativo não requerem autenticação. Para essas páginas, se a solicitação for uma solicitação de carregamento, não quero que o usuário precise esperar o extra de ~ 1,5 segundos para que a segurança da primavera instancie.
Eu já descobri como carregar todos os outros componentes do meu aplicativo, o Spring Security é o único que não sei. Alguém tem uma ideia?
EDIT: Se alguém souber como instanciar a segurança da primavera do código em vez de usar o ApplicationContext-security.xml, acho que poderia descobrir como carregá-lo preguiçoso.
Solução
Bem, finalmente descobri. Eu tive que subclasse org.springframework.web.context.ContextLoaderListener
e org.springframework.web.filter.DelegatingFilterProxy
para não fazer nada até que eu chame um método de ativação neles.
Outras dicas
O hack descrito aqui trabalhou para mim:
... Você pode resolver esse problema com qualquer fonte LazyinittargetSour para o UserDetailSService.
<bean id="userDetailsService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource">
<bean class="org.springframework.aop.target.LazyInitTargetSource">
<property name="targetBeanName" value="targetUserDetailsService"/>
</bean>
</property>
</bean>
<bean id="targetUserDetailsService" class="MyCustomUserService" lazy-init="true">
....
</bean>
Você pode configurar <url-pattern>
s de mapeamento de filtro de segurança da primavera em web.xml
Para combinar apenas com os recursos seguros (bem como páginas de login-logout e outros recursos que exigem o processamento de segurança da primavera) e envolva o filtro padrão com seu próprio invólucro preguiçoso, como você fez com DispatcherServlet
.
EDITAR:O problema parece ser mais complexo do que eu pensava. Você também pode tentar definir seu XML de segurança como <beans default-lazy-init="true" ...>