Вопрос по spring, basic-authentication, spring-security – Spring Security 3.0: основная подсказка аутентификации исчезнет

0

Я использую базовую аутентификацию Spring со следующими настройками в моей безопасности XML:

<code><http use-expressions="true" create-session="never" >
        <intercept-url pattern="/**" method="GET" access="isAuthenticated()" />
        <intercept-url pattern="/**" method="POST" access="isAuthenticated()" />
        <intercept-url pattern="/**" method="PUT" access="isAuthenticated()" />
        <intercept-url pattern="/**" method="DELETE" access="isAuthenticated()" />
        <http-basic />
    </http>
</code>

Если аутентификация не удалась, в браузере появится окно с предложением ввести имя пользователя и пароль. Есть ли способ, чтобы эта подсказка вообще не появлялась?

Ваш Ответ

3   ответа
1

Наиболее вероятная страница, которая используется для сбоя аутентификации, также защищена. Вы можете попробовать вручную установить страницу ошибки на страницу, которая не защищена, как

 <access-denied-handler error-page="/login.jsp"/> 

вместе с

 <intercept-url pattern="/*login*" access="hasRole('ROLE_ANONYMOUS')"/>

или же

<intercept-url pattern='/*login*' filters='none'/>  

или вы можете использоватьauto-config='true' атрибут элемента http, который исправит это для вас.Вот

Большое спасибо. Я настроил это так, как сделал парень по этой ссылке, и это сработало. Большое спасибо за вашу помощь! очень ценится. BlackEagle
Хорошо, теперь это имеет смысл. Проверьте этот ответstackoverflow.com/questions/4397062/… если это поможет
Спасибо @enterlezi. Я пытался добавить фильтры = "нет" и попытался добавить автоконфигурацию к элементу http, но это не сработало. Насколько я понимаю, приглашение появляется в результатеWWW-Authenticate: Basic realm="Spring Security Application" в заголовке ответа. Есть ли способ изменить заголовки ответа? BlackEagle
Проблема в том, что я не разрабатываю клиентские страницы. Я создаю остальные API, которые используют базовую аутентификацию. Так что у меня действительно нет ни одного сбоя URL для перенаправления. Знаете ли вы, есть ли способ, где я могу поймать сбой в обработчике, и там я могу контролировать заголовки ответа? BlackEagle
Я понятия не имею о заголовке, но я думаю, что проблема заключается в том, что URL-адрес ошибки аутентификации по-прежнему защищен. Попробуйте добавить элемент form-login в ваше определение http, например<sec:form-login login-page="/login.jsp" login-processing-url="/login" authentication-failure-url="/login.jsp?error" default-target-url="/home.jsp"/> и заменить вашими страницами (login.jsp). Также убедитесь, что эта страница исключена из фильтров, используя access = & quot; hasRole ("ROLE_ANONYMOUS"), так как вы указали use-expressions = & quot; true & quot;
0

У меня также была такая же проблема для диалогового окна входа в API REST в браузере. Как вы сказали, когда браузер видит заголовок ответа как

WWW-Authenticate: Basic realm="Spring Security Application

Появится диалоговое окно с простой аутентификацией. Для входа в REST API это не идеально. Вот как я это сделал. Определите пользовательскую точку входа аутентификации и вcommence set the header as "FormBased"

response.setHeader("WWW-Authenticate", "FormBased");

Конфигурация application-context.xml ниже

<security:http create-session="never" entry-point-ref="authenticationEntryPoint" authentication-manager-ref="authenticationManager">
    <security:custom-filter ref="customRestFilter" position="BASIC_AUTH_FILTER" />
    <security:intercept-url pattern="/api/**" access="ROLE_USER" />
</security:http>

<bean id="authenticationEntryPoint" class="com.tito.demo.workflow.security.RestAuthenticationEntryPoint">
</bean>

Пользовательский класс точки входа ниже.

@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    private static Logger logger = Logger.getLogger(RestAuthenticationEntryPoint.class);

    public void commence( HttpServletRequest request, HttpServletResponse response,
                          AuthenticationException authException ) throws IOException {
        logger.debug("<--- Inside authentication entry point --->");
        // this is very important for a REST based API login. 
        // WWW-Authenticate header should be set as FormBased , else browser will show login dialog with realm
        response.setHeader("WWW-Authenticate", "FormBased");
        response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
    }


}

Примечание: я использовал пружину 3.2.5. Выпуск

Теперь, когда API-интерфейс rest удастся получить с помощью restclient, такого как POSTMAN, сервер вернет 401 Unauthorized.

0

Я столкнулся с той же проблемой, и что я сделал, это создать кастомRequestMatcher в моем ресурсе сервера. Это мешаетOuth2 от отправкиWWW-Authenticate header.

Пример:

 @Override

    public void configure(HttpSecurity http) throws Exception {
         http.requestMatcher(new OAuthRequestedMatcher())
                .authorizeRequests()
                 .antMatchers(HttpMethod.OPTIONS).permitAll()
                    .anyRequest().authenticated();
    }

    private static class OAuthRequestedMatcher implements RequestMatcher {
        public boolean matches(HttpServletRequest request) {
            String auth = request.getHeader("Authorization");
            boolean haveOauth2Token = (auth != null) && auth.startsWith("Bearer");
            boolean haveAccessToken = request.getParameter("access_token")!=null;
   return haveOauth2Token || haveAccessToken;
        }
    }

Похожие вопросы