Последние несколько дней я пытался найти решение для своей проблемы, что заставило меня опубликовать этот запрос.
Может обнаружиться, что в моем приложении Spring во время входа в систему вызывается вызов аутентификации для AuthenticationProvider.почти 7 раз для входа в систему.
В приложении я использовал понятия BasicAuthenticationEntryPoint, AuthenticationManager, AuthenticationProvider.
Ниже приведены подробности конфигурации, в application_context_security
<http use-expressions="true" create-session="stateless"
authentication-manager-ref="authManager">
<intercept-url pattern="/services/**" access="authenticated" />
<http-basic entry-point-ref="testAuthenticationEntryPoint" />
</http>
<beans:bean id="testAuthenticationEntryPoint"
class="com.test.TestAuthenticationEntryPoint" />
<beans:bean id="authenticationProvider"
class="com.test.TestAuthenticationProvider" />
<beans:bean id="authManager"
class="com.Test.TestAuthenticationManager" />
<debug></debug>
TestAuthenticationEntryPoint.java
@Component("testAuthenticationEntryPoint")
public class TestAuthenticationEntryPoint extends BasicAuthenticationEntryPoint
{
@Override
public void commence(final HttpServletRequest request, final HttpServletResponse response,
final AuthenticationException authException) throws IOException, ServletException
{
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.addHeader("WWW-Authenticate", "FormBased");
}
@Override
public void afterPropertiesSet() throws Exception
{
setRealmName("REST_REALM");
super.afterPropertiesSet();
}
}
SecurityConfig.java
@Configuration
@ImportResource({ "classpath:applicationContext-security.xml" })
@ComponentScan("com.test")
public class SpringSecurityConfig
{
public SpringSecurityConfig()
{
super();
LOGGER.info("################ SpringSecurityConfig calling from CONSTRUCTOR ################");
}
WebConfig.java
@Configuration
@ComponentScan("com.test")
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter
{
public WebConfig()
{
super();
LOGGER.info("################ WebConfig calling from CONSTRUCTOR ################");
}
}
TestAuthenticationManager.java
public class TestAuthenticationManager implements AuthenticationManager
{
@Autowired()
TestAuthenticationProvider testAuthenticationProvider;
@Override
public Authentication authenticate(Authentication auth) throws AuthenticationException
{
LOGGER.info("################ RestAuthenticationManager authenticate() ################");
return testAuthenticationProvider.authenticate(auth);
}
AuthenticationProvider
public class TestAuthenticationProvider implements AuthenticationProvider
{
@Autowired
AuthenticationService authenticationService;
@Override
public Authentication authenticate(Authentication auth) throws AuthenticationException
{
LOGGER.info("################ TestAuthenticationProvider authenticate() ################");
TestAuthentication authentication = authenticationService.authenticate(auth.getName(), auth.getCredentials());
}
@Override
public boolean supports(Class<?> arg0)
{
return arg0.equals(TestAuthentication.class);
}
}
Служба AuthenticationService помечена как @Service, и здесь выполняется проверка имени пользователя и pwd.
TestAuthentication - это класс POJO, который расширяет UsernamePasswordAuthenticationToken, который содержит идентификатор пользователя, имя пользователя,authToken.
Пока PerfПри формировании имени входа журналы, упомянутые в TestAuthenticationManager и TestAuthenticationProvider, неоднократно появляются почти 7 раз. Как мы можем избежать этой множественной аутентификации?
Пробовал разными способами, одним из которых было использование тега в файле xml и предоставление класса поставщика аутентификации внутри него, а также использование аннотации @Component для TestAuthenticationProvider, прокомментировал класс AuthenticationManager. Но в этом случаеэлемент управления не переходит в класс AuthenticationProvider.
Пожалуйста, дайте мне знать, как можно избежать нескольких вызовов или что является причиной сбоя.