Подтвердить что ты не робот

Почему "anonymousUser" аутентифицирован в Spring безопасности?

Это мой главный контроллер:

package org.demian.demibox.controllers;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class MainController {
    private String getUsername() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth.isAuthenticated())
            return auth.getName();
        else
            return null;
    }
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String showHome() {
        String username = getUsername();
        System.out.println(username);
        if (username == null || username.length() == 0)
            return "welcome";
        return "index";
    }
}

Даже если я не вошел в систему, auth.isAuthenticated() всегда возвращает true. Почему это? А когда auth.isAuthenticated() вернет false? Имя аутентифицированного пользователя anonymousUser, если я не зарегистрирован и имя пользователя, если я вошел в систему.

ИЗМЕНИТЬ

Это мой файл security-context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.org/schema/security"
    xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <security:authentication-manager>
        <security:authentication-provider>
            <security:jdbc-user-service data-source-ref="dataSource" id="jdbcUserService" />
            <!-- <security:password-encoder ref="passwordEncoder" /> -->
        </security:authentication-provider>
    </security:authentication-manager>
    <security:http use-expressions="true">
        <security:intercept-url pattern="/" access="permitAll" />
        <security:intercept-url pattern="/login" access="permitAll" />
        <security:intercept-url pattern="/redeem" access="permitAll" />
        <security:intercept-url pattern="/redeem_code" access="permitAll" />
        <security:intercept-url pattern="/static/**" access="permitAll" />
        <security:intercept-url pattern="/*" access="isAuthenticated()" />
        <security:intercept-url pattern="/**" access="isAuthenticated()" />
        <security:intercept-url pattern="/**" access="denyAll" />
        <security:form-login login-page="/login" authentication-failure-url="/login?error=true" />
        <security:logout logout-success-url="/" />
        <security:remember-me key="offersAppKey" user-service-ref="jdbcUserService" />
    </security:http>
    <security:global-method-security secured-annotations="enabled" />
    <!-- <bean id="passwordEncoder" class="org.springframework.security.crypto.password.StandardPasswordEncoder" /> -->
</beans>

И следующие строки находятся в файле web.xml:

<filter>
    <display-name>springSecurityFilterChain</display-name>
    <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>

Я использую Tomcat 8.0 и все последние зависимости через Maven.

4b9b3361

Ответ 1

Вот как Spring-Security работает по умолчанию.

Из документов:

Обратите внимание, что нет реальной концептуальной разницы между пользователем, который является "анонимно аутентифицированным", и неаутентифицированным пользователем. Анонимная аутентификация Spring Securitys дает вам более удобный способ настройки атрибутов контроля доступа. Вызовы API-вызовов сервлетов, такие как, например, getCallerPrincipal, по-прежнему будут возвращать ноль, даже если в SecurityContextHolder фактически есть анонимный объект аутентификации.

Существуют и другие ситуации, когда анонимная аутентификация полезна, например, когда перехватчик аудита запрашивает SecurityContextHolder, чтобы определить, какой принципал отвечал за данную операцию. Классы могут создаваться более надежно, если они знают, что SecurityContextHolder всегда содержит объект Authentication и никогда не является нулевым.

Если вам нужно проверить, является ли это anonymousUser, вы можете проверить, является ли объект Authentication экземпляром AnonymousAuthenticationToken или нет.